Android TabHost TabWidget 去除黑线(底部下划线)

采用TabHost布局时,往往会发现默认的系统风格与软件风格很不协调,比如TabWidget的下划线影响布局效果。通常情况下会去除其下划线。如果是采用xml布局文件,在TabWidget的属性项设置android:tabStripEnabled=”false”(经测试发现,这个属性是在2.2版本以上才能使用),这样能达到去除下划线的目的。

但是如果使用代码去除下划线,情况就比较复杂,就需要根据不同的版本去除下划线。如果是2.2,2.3版本,去除下划线只需要调用一个方法:tabWidget.setStripEnabled(false);就可以去除下划线。但是在2.1及以下版本,就无法去除下划线,因为2.1没有tabWidget.setStripEnabled(boolean b)这个方法。这个时候,可以分析android 2.1,2.2,2.3关于TabWidget的源码,采用反射修改私有的mBottomLeftStrip,mBottomRightStrip两个变量(2.2,2.3是mLeftStrip,mRightStrip两个变量),从而达到修改。

具体源码:

package com.test.main;

 

import java.lang.reflect.Field;

 

import android.app.TabActivity;

import android.content.Intent;

import android.os.Build;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.widget.TabHost;

import android.widget.TabWidget;

import android.widget.TextView;

import android.widget.TabHost.OnTabChangeListener;

 

public class TabhostActivity extends TabActivity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// setContentView(R.layout.main);

 

int width =45;

int height =68;

 

final TabHost tabs = getTabHost();

final TabWidget tabWidget = tabs.getTabWidget();

 

Field mBottomLeftStrip;

Field mBottomRightStrip;

 

LayoutInflater.from(this).inflate(R.layout.main, tabs.getTabContentView(), true);

 

tabs.addTab(tabs.newTabSpec("first tab")

.setIndicator("信息", getResources().getDrawable(android.R.drawable.ic_dialog_email))

.setContent(new Intent(TabhostActivity.this,OneActivity.class))

);

 

tabs.addTab(tabs.newTabSpec("second tab")

.setIndicator("收藏",getResources().getDrawable(android.R.drawable.ic_menu_add))

.setContent(new Intent(TabhostActivity.this,TwoActivity.class)));

 

tabs.addTab(tabs.newTabSpec("third tab")

.setIndicator("摄影",getResources().getDrawable(android.R.drawable.ic_menu_camera))

.setContent(new Intent(TabhostActivity.this,ThreeActivity.class)));

 

tabs.setCurrentTab(0);

 

for (int i =0; i < tabWidget.getChildCount(); i++) {

/**

* 设置高度、宽度,不过宽度由于设置为fill_parent,在此对它没效果

*/

tabWidget.getChildAt(i).getLayoutParams().height = height;

tabWidget.getChildAt(i).getLayoutParams().width = width;

 

/**

* 设置tab中标题文字的颜色,不然默认为黑色

*/

final TextView tv = (TextView) tabWidget.getChildAt(i).findViewById(android.R.id.title);

 

tv.setTextColor(this.getResources().getColorStateList(android.R.color.white));

 

/**

* 此方法是为了去掉系统默认的色白的底角

*

* 在 TabWidget中mBottomLeftStrip、mBottomRightStrip

* 都是私有变量,但是我们可以通过反射来获取

*

* 由于Android 2.2,2.3的接口不同,加个判断

*/

 

if (Float.valueOf(Build.VERSION.RELEASE.substring(0, 3)) <= 2.1) {

try {

mBottomLeftStrip = tabWidget.getClass().getDeclaredField ("mBottomLeftStrip");

mBottomRightStrip = tabWidget.getClass().getDeclaredField ("mBottomRightStrip");

if(!mBottomLeftStrip.isAccessible()) {

mBottomLeftStrip.setAccessible(true);

}

if(!mBottomRightStrip.isAccessible()){

mBottomRightStrip.setAccessible(true);

}

mBottomLeftStrip.set(tabWidget, getResources().getDrawable (R.drawable.no));

mBottomRightStrip.set(tabWidget, getResources().getDrawable (R.drawable.no));

 

} catch (Exception e) {

e.printStackTrace();

}

} else {

 

//如果是2.2,2.3版本开发,可以使用一下方法tabWidget.setStripEnabled(false)

//tabWidget.setStripEnabled(false);

 

//但是很可能你开发的android应用是2.1版本,

//tabWidget.setStripEnabled(false)编译器是无法识别而报错的,这时仍然可以使用上面的

//反射实现,但是需要修改代码

 

try {

//2.2,2.3接口是mLeftStrip,mRightStrip两个变量,当然代码与上面部分重复了

mBottomLeftStrip = tabWidget.getClass().getDeclaredField ("mLeftStrip");

mBottomRightStrip = tabWidget.getClass().getDeclaredField ("mRightStrip");

if(!mBottomLeftStrip.isAccessible()) {

mBottomLeftStrip.setAccessible(true);

}

if(!mBottomRightStrip.isAccessible()){

mBottomRightStrip.setAccessible(true);

}

mBottomLeftStrip.set(tabWidget, getResources().getDrawable (R.drawable.no));

mBottomRightStrip.set(tabWidget, getResources().getDrawable (R.drawable.no));

 

} catch (Exception e) {

e.printStackTrace();

}

 

}

View vvv = tabWidget.getChildAt(i);

if(tabs.getCurrentTab()==i){

vvv.setBackgroundDrawable(getResources().getDrawable(R.drawable.selected));

}

else {

vvv.setBackgroundDrawable(getResources().getDrawable(R.drawable.green));

}

 

}

/**

* 当点击tab选项卡的时候,更改当前的背景

*/

tabs.setOnTabChangedListener(new OnTabChangeListener(){

@Override

public void onTabChanged(String tabId) {

// TODO Auto-generated method stub

for (int i =0; i < tabWidget.getChildCount(); i++) {

View vvv = tabWidget.getChildAt(i);

if(tabs.getCurrentTab()==i){

vvv.setBackgroundDrawable(getResources().getDrawable(R.drawable.selected));

}

else {

vvv.setBackgroundDrawable(getResources().getDrawable(R.drawable.green));

}

}

}});

}

}

 

posted @   brave-sailor  阅读(1122)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示