动态设置TabHost选项卡属性及自定义TabHost选项Layout

TabHost生成后会向内添加TabSpec以形成选项栏:

如果是继承的TabActivity类:

tabhost = getTabHost();
tabhost.addTab(tabhost.newTabSpec("1").setIndicator("TAB 1", getResources().getDrawable(R.drawable.icon)).setContent(R.id.text1)); 
tabhost.setCurrentTab(0);


如果是直接继承Activity类:

tabhost = (TabHost) findViewById(R.id.tabhost);
tabhost.setup();
tabhost.addTab(tabhost.newTabSpec("1").setIndicator("TAB 1", getResources().getDrawable(R.drawable.icon)).setContent(R.id.text1)); 
tabhost.setCurrentTab(0);

注意加.setup(),否则会有NullPointer的异常


main.xml:

<TabHost android:id="@+id/tabhost" android:layout_width="fill_parent" android:layout_height="wrap_content">
	<LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">
		<TabWidget android:id="@android:id/tabs" android:layout_width="fill_parent" android:layout_height="fill_parent" />
		<FrameLayout android:id="@android:id/tabcontent" android:layout_width="fill_parent" android:layout_height="fill_parent">
			<TextView android:id="@+id/text1" android:layout_width="wrap_content" android:layout_height="wrap_content" />
		</FrameLayout>
	</LinearLayout>
</TabHost> 

注意:TabHost标签下的TabWidget和FrameLayout的id是固定的,分别为"tabs"和"tabcontent"


----------------------------------------------------------------------------------分割线---------------------------------------------------------------------------------------------


动态更改TabHost的选项卡头显示,有两种方法:一种比较笨而且可控性差(为什么还要讲一会再说),一种比较简单而且可控性高,我们先说简单的那一种:

TabHost本身不提供有效的函数支持对选项卡头的动态更改,但是我们可以通过TabHost的getTabWidget()函数得到选项卡头的View从而"曲线"更改选项卡头的属性:

ImageView iv = (ImageView) tabhost.getTabWidget().getChildAt(targetLocation).findViewById(android.R.id.icon);
TextView tv = (TextView) tabhost.getTabWidget().getChildAt(targetLocation).findViewById(android.R.id.title);
tv.setText("XXXX");
iv.setImageDrawable(getResources().getDrawable(R.drawable.icon));			
其中获得的ImageView即是TabHost的选项卡头在targetLocation位置的图片的View,TextView是对应的文字的View,这样就可以对它们进行任意的改动了,注意targetLocation从0开始

还有一种比较笨的方法:

就是自定义TabHost选项卡头的Layout,如下:

tabhost = getTabHost();
RelativeLayout tempLayout = (RelativeLayout) LayoutInflater.from(this).inflate(R.layout.mytab, null);
TextView targetTabLabel = (TextView) tempLayout.findViewById(R.id.tab_text);
targetTabLabel.setText("TAB 1");
tempLayout.removeAllViews();
tabhost.addTab(tabhost.newTabSpec("1").setIndicator(targetTabLabel).setContent(R.id.text1));

注意要对tempLayout使用removeAllViews(),否则在将targetTabLabel加入TabHost中时会出现java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.的异常


其中R.layout.mytab来自mytab.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
<TextView android:id="@+id/tab_text"  
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:textStyle="bold" 
        android:background="@drawable/selector_img"/>
</RelativeLayout>

其中android:text="@drawable/selector_img"指向selector_img.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="false"
	  android:drawable="@drawable/img1">
</item>
<item android:state_selected="true"
      android:drawable="@drawable/img2">
</item>
</selector>

点击时使用Selector置换背景图片,文字的更改尚未用此方法验证,这种方法非常繁琐而且可控性太差,只能响应选择事件,且只能更改2个选项,但是之所以讲解这种方法,是因为这里顺便讲解了如何自定义TabHost选项卡头的Layout,如果你想在UI上做出更多的花样,这个技巧是很有帮助的。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TabHostAndroid 中常用的一个布局控件,可以用于实现选项卡的效果。要实现左侧选项卡,可以通过以下步骤: 1. 在布局文件中,使用 TabHost 控件,并设置其高度和宽度为 match_parent。 2. 在 TabHost 中添加一个 TabWidget 控件,用于显示选项卡标签。 3. 在 TabHost 中添加一个 FrameLayout 控件,用于显示选项卡内容。 4. 在代码中,使用 TabHost.newTabSpec() 方法创建一个新的选项卡设置其标签和内容,并将其添加到 TabHost 中。 5. 在 TabWidget 中设置选项卡标签的样式,例如设置背景颜色、文字颜色等等。 6. 在 TabHost设置选项卡的切换方式,例如设置为点击切换或滑动切换。 以下是一个简单的示例代码,演示如何实现左侧选项卡: ``` <FrameLayout android:id="@android:id/tabcontent" android:layout_width="match_parent" android:layout_height="match_parent"> </FrameLayout> <TabWidget android:id="@android:id/tabs" android:layout_width="wrap_content" android:layout_height="match_parent" android:background="#f0f0f0" android:orientation="vertical" android:layout_alignLeft="@android:id/tabcontent" android:layout_alignStart="@android:id/tabcontent"> </TabWidget> ``` Java 代码: ``` TabHost tabHost = findViewById(android.R.id.tabhost); tabHost.setup(); // 创建一个新的选项卡 TabHost.TabSpec spec1 = tabHost.newTabSpec("tab1"); spec1.setIndicator("选项卡1"); spec1.setContent(R.id.tab1); tabHost.addTab(spec1); // 创建另一个选项卡 TabHost.TabSpec spec2 = tabHost.newTabSpec("tab2"); spec2.setIndicator("选项卡2"); spec2.setContent(R.id.tab2); tabHost.addTab(spec2); // 设置选项卡的切换方式 tabHost.setOnTabChangedListener(new TabHost.OnTabChangeListener() { @Override public void onTabChanged(String tabId) { // 处理选项卡切换事件 } }); // 设置选项卡标签的样式 TabWidget tabWidget = tabHost.getTabWidget(); for (int i = 0; i < tabWidget.getChildCount(); i++) { View view = tabWidget.getChildAt(i); view.setBackgroundColor(Color.parseColor("#ffffff")); TextView textView = view.findViewById(android.R.id.title); textView.setTextColor(Color.parseColor("#000000")); } ``` 以上代码中,通过添加两个选项卡实现左侧选项卡的效果。您可以根据需要添加更多的选项卡,并自定义选项卡标签的样式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值