zoukankan      html  css  js  c++  java
  • TabActivity中的Tab标签详细设置

    参考链接:

    http://www.iteye.com/topic/602737

    这个写的很不错,我是跟着一步步写下来的,不过到最后也遇到了麻烦,就是不能将Tab标签的文字和图片分开,始终是重合的,而且每个具体的代码,还是搞了许久才出来,故而分享之,希望能给大家带来方便,也谢谢下面的高人,呵呵!

    http://www.youmi.net/bbs/thread-102-1-4.html

    这个和上面的代码是一样的,不过代码不全,对于初学者来说,考验的时候来了,完善就是提高的过程,不要怕麻烦!

    下面就根据上面的参考自己写的,当然大部分是相同的,不过有详细的注释,完整的代码

    如果有什么不明白就留言吧!呵呵

    首先结果图:

    图1:

    图2:



    图3:


    当然界面没有前面的仁兄好看,我是讲究实用,美化需要自己慢慢做了

    呵呵

    下面直接代码:

    Java代码 收藏代码
    1. package com.woclub.tabactivitytest;
    2. import android.app.TabActivity;
    3. import android.content.res.ColorStateList;
    4. import android.graphics.Color;
    5. import android.os.Bundle;
    6. import android.util.Log;
    7. import android.view.Gravity;
    8. import android.view.View;
    9. import android.widget.ImageView;
    10. import android.widget.LinearLayout;
    11. import android.widget.TabHost;
    12. import android.widget.TabWidget;
    13. import android.widget.TextView;
    14. import android.widget.TabHost.OnTabChangeListener;
    15. /**
    16. * 总结:在设置Tab的布局的时候首先需要newTabSpec再在其设置setIndicator(Tab名字,Tab的图标),
    17. * 尤其需要注意setContent(),它有三种使用方法setContent(int)它是直接在布局文件中设置其布局,
    18. * setContent(Intent)可以用Intent指定一个Activity,
    19. * setContent(TabContentFactory)可以用一个类来指定其布局的方式
    20. * @author Administrator
    21. *
    22. */
    23. public class MainActivity extends TabActivity {
    24. private static final String Tab1 = "Tab1";
    25. private static final String Tab2 = "Tab2";
    26. private static final String Tab3 = "Tab3";
    27. private static final String Tab4 = "Tab4";
    28. /** Called when the activity is first created. */
    29. @Override
    30. public void onCreate(Bundle savedInstanceState) {
    31. super.onCreate(savedInstanceState);
    32. setContentView(R.layout.main);
    33. //1得到TabHost对象,正对TabActivity的操作通常都有这个对象完成
    34. final TabHost tabHost = this.getTabHost();
    35. final TabWidget tabWidget = tabHost.getTabWidget();
    36. //2生成一个Intent对象,该对象指向一个Activity,当然现在例子比较简单就没有绑定其他的Activity故而不用
    37. //3生成一个TabSpec对象,这个对象代表了一个Tab页
    38. TabHost.TabSpec tabSpec = tabHost.newTabSpec(Tab1);
    39. //设置该页的indicator(指示器)设置该Tab页的名字和图标,以及布局
    40. tabSpec.setIndicator(composeLayout("爽哉", R.drawable.coke))
    41. .setContent(R.id.view1);
    42. //4将设置好的TabSpec对象添加到TabHost当中
    43. tabHost.addTab(tabSpec);
    44. //第二个Tab
    45. tabHost.addTab(tabHost.newTabSpec(Tab2).setIndicator(composeLayout("安逸", R.drawable.coke))
    46. .setContent(R.id.view2));
    47. //第三个Tab
    48. tabHost.addTab(tabHost.newTabSpec(Tab3).setIndicator(composeLayout("开心", R.drawable.coke))
    49. .setContent(R.id.view3));
    50. //第四个Tab
    51. tabHost.addTab(tabHost.newTabSpec(Tab4).setIndicator(composeLayout("说明", R.drawable.coke))
    52. .setContent(R.id.view4));
    53. //setContent(TabContentFactory)可以用一个类来指定其布局的方式,前三个都是用的setContent(int)方式
    54. // CustomLayout custom = new CustomLayout(this);
    55. // tabHost.addTab(tabHost.newTabSpec(Tab4).setIndicator("Tab4", getResources()
    56. // .getDrawable(R.drawable.icon))
    57. // .setContent(custom));
    58. //*****************************这是对Tab标签本身的设置*******************************************
    59. int width =45;
    60. int height =48;
    61. for(int i = 0; i < tabWidget.getChildCount(); i++)
    62. {
    63. //设置高度、宽度,不过宽度由于设置为fill_parent,在此对它没效果
    64. tabWidget.getChildAt(i).getLayoutParams().height = height;
    65. tabWidget.getChildAt(i).getLayoutParams().width = width;
    66. /**
    67. * 下面是设置Tab的背景,可以是颜色,背景图片等
    68. */
    69. View v = tabWidget.getChildAt(i);
    70. if (tabHost.getCurrentTab() == i) {
    71. v.setBackgroundColor(Color.GREEN);
    72. //在这里最好自己设置一个图片作为背景更好
    73. //v.setBackgroundDrawable(getResources().getDrawable(R.drawable.chat));
    74. } else {
    75. v.setBackgroundColor(Color.GRAY);
    76. }
    77. }
    78. //************************************************************************************
    79. //设置Tab变换时的监听事件
    80. tabHost.setOnTabChangedListener(new OnTabChangeListener() {
    81. @Override
    82. public void onTabChanged(String tabId) {
    83. // TODO Auto-generated method stub
    84. //当点击tab选项卡的时候,更改当前的背景
    85. for(int i = 0; i < tabWidget.getChildCount(); i++)
    86. {
    87. View v = tabWidget.getChildAt(i);
    88. if (tabHost.getCurrentTab() == i) {
    89. v.setBackgroundColor(Color.GREEN);
    90. } else {
    91. //这里最后需要和上面的设置保持一致,也可以用图片作为背景最好
    92. v.setBackgroundColor(Color.GRAY);
    93. }
    94. }
    95. }
    96. });
    97. }
    98. //#################################################################这是设置TabWidget的布局
    99. /**
    100. * 这个设置Tab标签本身的布局,需要TextView和ImageView不能重合
    101. * s:是文本显示的内容
    102. * i:是ImageView的图片位置
    103. * 将它设置到setIndicator(composeLayout("开心", R.drawable.coke))中
    104. */
    105. public View composeLayout(String s, int i){
    106. Log.e("Error", "composeLayout");
    107. LinearLayout layout = new LinearLayout(this);
    108. layout.setOrientation(LinearLayout.VERTICAL);
    109. TextView tv = new TextView(this);
    110. tv.setGravity(Gravity.CENTER);
    111. tv.setSingleLine(true);
    112. tv.setText(s);
    113. tv.setTextColor(Color.RED);
    114. layout.addView(tv,
    115. new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
    116. ImageView iv = new ImageView(this);
    117. iv.setImageResource(i);
    118. layout.addView(iv,
    119. new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
    120. return layout;
    121. }
    122. //#################################################################
    123. }


    我都有详细的注释,估计大家都能看懂的,有些地方给了提示,扩展的需要就需要自己去完成了

    下面是一个两个布局文件

    一个是在layout中设置:

    Java代码 收藏代码
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <!--
    3. 一个典型的标签Activity 是由2 部分构成的 且其id都有规定 即:
    4. * TabWidget 用于展示标签页 id=tabs
    5. * FrameLayout 用于展示隶属于各个标签的具体布局 id=tabconten
    6. * TabHost 用于整个Tab布局 id=TabHost
    7. 还需注意要将Tab显示在最下面就需要这只LinearLayout时用Bottom
    8. -->
    9. <TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    10. android:id="@android:id/tabhost"
    11. android:layout_width="fill_parent"
    12. android:layout_height="fill_parent"
    13. >
    14. <LinearLayout
    15. android:orientation="vertical"
    16. android:gravity="bottom"
    17. android:layout_width="fill_parent"
    18. android:layout_height="fill_parent">
    19. <FrameLayout
    20. android:id="@android:id/tabcontent"
    21. android:layout_width="fill_parent"
    22. android:layout_height="200dip" >
    23. <RelativeLayout
    24. android:id="@+id/view1"
    25. android:orientation="vertical"
    26. android:layout_width="fill_parent"
    27. android:layout_height="fill_parent">
    28. <TextView
    29. android:id="@+id/text1"
    30. android:layout_width="wrap_content"
    31. android:layout_height="wrap_content"
    32. android:text="需要光临第一个Tab"/>
    33. <ImageView
    34. android:id="@+id/image1"
    35. android:layout_height="wrap_content"
    36. android:layout_below="@id/text1"
    37. android:layout_width="wrap_content"
    38. android:src="@drawable/icon"
    39. />
    40. </RelativeLayout>
    41. <TextView
    42. android:id="@+id/view2"
    43. android:layout_width="fill_parent"
    44. android:layout_height="fill_parent"
    45. android:text="需要光临第二个Tab"/>
    46. <TextView
    47. android:id="@+id/view3"
    48. android:layout_width="fill_parent"
    49. android:layout_height="fill_parent"
    50. android:text="需要光临第三个Tab"/>
    51. <TextView
    52. android:id="@+id/view4"
    53. android:layout_width="fill_parent"
    54. android:layout_height="fill_parent"
    55. />
    56. </FrameLayout>
    57. <TabWidget
    58. android:id="@android:id/tabs"
    59. android:layout_width="fill_parent"
    60. android:layout_height="wrap_content">
    61. </TabWidget>
    62. </LinearLayout>
    63. </TabHost>

    还有一个在类中设置,设置都差不多,在此类中设置只是针对每个Tab页面的设置

    Java代码 收藏代码
    1. package com.woclub.tabactivitytest;
    2. import android.app.Activity;
    3. import android.view.Gravity;
    4. import android.view.LayoutInflater;
    5. import android.view.View;
    6. import android.widget.Button;
    7. import android.widget.EditText;
    8. import android.widget.ImageView;
    9. import android.widget.LinearLayout;
    10. import android.widget.RadioButton;
    11. import android.widget.RadioGroup;
    12. import android.widget.TabHost;
    13. import android.widget.TextView;
    14. /**
    15. * 此类的功能是设置每个Tab标签的布局方式
    16. * 使用方法
    17. * CustomLayout ct = new CustomLayout(this);
    18. * tHost.addTab(tHost.newTabSpec(Tab4).setIndicator("Tab 4").setContent(ct));
    19. * @author Administrator
    20. *
    21. */
    22. public class CustomLayout implements TabHost.TabContentFactory{
    23. private Activity myActivity;
    24. private LayoutInflater layoutHelper;//用于实例化布局
    25. private LinearLayout layout;
    26. //构造函数,从外面传递参数Activity
    27. public CustomLayout(Activity myActivity)
    28. {
    29. this.myActivity = myActivity;
    30. //通过getLayoutInflater从Activity中得到一个实例化的LayoutInflater
    31. layoutHelper = myActivity.getLayoutInflater();
    32. }
    33. /**
    34. * 根据不同的Tab创建不同的视图
    35. */
    36. @Override
    37. public View createTabContent(String tag) {
    38. // TODO Auto-generated method stub
    39. return addCustomView(tag);
    40. }
    41. /**
    42. * 根据Tab的id设置不同Tab的view
    43. * 这是普通的设置方式,设置每个Tab的布局
    44. * @param id
    45. * @return
    46. */
    47. private View addCustomView(String id)
    48. {
    49. layout = new LinearLayout(myActivity);
    50. layout.setOrientation(LinearLayout.HORIZONTAL);
    51. if(id.equals("Tab1"))
    52. {
    53. ImageView iv = new ImageView(myActivity);
    54. iv.setImageResource(R.drawable.chat);
    55. //设置layout的布局,将一个ImageView添加到其中,并设置ImageView的布局格式,addView的第二个参数是设置ImageView的width和Height
    56. layout.addView(iv, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT));
    57. }
    58. else if(id.equals("Tab2"))
    59. {
    60. //第一个控件,注意每添加一个空间都需要用addView添加到layout中
    61. EditText edit = new EditText(myActivity);
    62. layout.addView(edit, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
    63. //第二个控件
    64. Button button = new Button(myActivity);
    65. button.setText("确定");
    66. button.setWidth(100);
    67. layout.addView(button, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
    68. //第三个控件
    69. RadioGroup rGroup = new RadioGroup(myActivity);
    70. rGroup.setOrientation(LinearLayout.HORIZONTAL);
    71. RadioButton radio1 = new RadioButton(myActivity);
    72. radio1.setText("Radio A");
    73. rGroup.addView(radio1);
    74. RadioButton radio2 = new RadioButton(myActivity);
    75. radio2.setText("Radio B");
    76. rGroup.addView(radio2);
    77. layout.addView(rGroup,
    78. new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
    79. }
    80. else if(id.equals("Tab3"))
    81. {
    82. TextView text = new TextView(myActivity);
    83. text.setText("the third TextView");
    84. text.setGravity(Gravity.CENTER);
    85. layout.addView(text);
    86. }
    87. else if(id.equals("Tab4"))
    88. {
    89. LinearLayout.LayoutParams param3 =
    90. new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT);
    91. //在这里面又引用了布局文件来设置控件
    92. layout.addView(layoutHelper.inflate(R.layout.hello, null),param3);
    93. }
    94. return layout;
    95. }
    96. }

    好了,该说的都在代码中说明了

    希望大家喜欢,做的粗糙,就由大家去改进吧!

    呵呵!

    欢迎大家的讨论


    转:http://hao3100590.iteye.com/blog/974343

  • 相关阅读:
    Nim or not Nim? hdu3032 SG值打表找规律
    Maximum 贪心
    The Super Powers
    LCM Cardinality 暴力
    Longge's problem poj2480 欧拉函数,gcd
    GCD hdu2588
    Perfect Pth Powers poj1730
    6656 Watching the Kangaroo
    yield 小用
    wpf DropDownButton 源码
  • 原文地址:https://www.cnblogs.com/yangkai-cn/p/4016834.html
Copyright © 2011-2022 走看看