采用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));

}

}

}});

}

}

Android TabHost TabWidget 去除黑线(底部下划线)的更多相关文章

  1. Android EditText如何去除边框添加下划线

    (一)问题 之前的自定义EditText只能显示高度不超过屏幕高度的文本内容,继续增加内容会出现如下问题: (二)原因分析 下部(超出屏幕高度的部分)没有继续画线,也就是说横线没有画够,那么一定是循环 ...

  2. android实现对导航Tab设置下划线选中效果

    技术人员核心竞争力还是技术啊.努力提高各种实现效果.加油哦! 直接看效果.此linearLayout只有两个Button ,当选中Button1,Button1有个下划线选中效果.当选中Buton2, ...

  3. 关于android中EditText边框的问题 下划线

    方法1 将edittext的style设置成?android:attr/textViewStyle 取消掉默认的样式,在设置background为@null 接下来就是一个空空的edittext了, ...

  4. android TextView 例子代码(文字中划线、文字下划线)

    XML: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android ...

  5. CSS超链接样式,去除下划线等

    控制超链接样式 链接的四种状态: a:link - 普通的.未被访问的链接 a:visited - 用户已访问的链接 a:hover - 鼠标指针位于链接的上方 a:active - 链接被点击的时刻 ...

  6. Button的几种常用的xml背景,扁平化,下划线,边框包裹,以及按压效果

    Button的几种常用的xml背景,扁平化,下划线,边框包裹,以及按压效果 分享下我项目中用到的几种Button的效果,说实话,还真挺好看的 一.标准圆角 效果是这样的 他的实现很简单,我们只需要两个 ...

  7. React-Native 之 GD (二十)removeClippedSubviews / modal放置的顺序 / Android 加载git图\动图 / 去除 Android 中输入框的下划线 / navigationBar

    1.removeClippedSubviews 用于提升大列表的滚动性能.需要给行容器添加样式overflow:’hidden’.(Android已默认添加此样式)此属性默认开启 这个属性是因为在早期 ...

  8. android TextView 添加下划线

    android Textview加下划线 由于新做的一个项目要求有字体带下划线效果,当时看了下其实可以通过图片伪造出那种视觉效果.但是为了体现点技术含量,于是我想用Textview带下划线的效果.方法 ...

  9. Android TextView中实现点击文本超链接(无下划线)的封装类

    android中有的时候须要在TextView上设置一些超链接,点击这些超链接时进行一些操作.比如新浪微博上的一些keyword,点击时会跳转到对应的页面. 怎样实现我们就直接看源代码吧. /** * ...

随机推荐

  1. innodb 悲观锁,乐观锁

    转 http://www.cnblogs.com/chenwenbiao/archive/2012/06/06/2537508.html CREATE TABLE `products` ( `id` ...

  2. 【转】Cocos2d-x 程序是如何开始运行与结束的

    转自:http://blog.leafsoar.com/archives/2013/05-05.html 题记:对于技术,我们大可不必挖得那么深,但一定要具备可以挖得很深的能力 问题的由来 怎么样使用 ...

  3. c#.net与vb.net中读写Cookie的方法!

    Cookie (HttpCookie的实例)提供了一种在 Web 应用程序中存储用户特定信息的方法.例如,当用户访问您的站点时,您可以使用 Cookie 存储用户首选项或其他信息.当该用户再次访问您的 ...

  4. java设计模式—Adapter模式

    1.核心意图:     将一个类的接口转换成客户希望的另外一个接口,从而使得原本由于接口不兼容而不能一起工作的类可以一起工作. 该模式的目标是通过一个代理(这里是Adapter),在原来的类(Adap ...

  5. Java was started but returned exit code=13 C:\ProgramData\Oracle\Java\javapath\javaw.exe

    ---------------------------Eclipse---------------------------Java was started but returned exit code ...

  6. 使用appium做安卓手机web自动化测试 真机demo

    一:appium相关环境搭建过程略. 二:连接真机: 1.手机(andriod 4.2.2)连接电脑,打开USB调试模式. 2.运行cmd 输入 adb devices -l 查看UDID,如图: 3 ...

  7. IE兼容性问题解决方案1--ajax请求不发送到后台

    相信很多小伙伴会遇到这种问题,用ajax做异步请求的时候,在IE浏览器下,并没有发送出去.但是相关程序确实执行了.为什么呢? 原来这是IE缓存方式的原因,所以呢,用下边的解决方案吧. 1.在请求的UR ...

  8. C# CLRInsideOut 托管代码与非托管代码互操作,产生相关调用代码的好工具 C++ 头文件转C# 的好工具(转

    http://www.cnblogs.com/jxsoft/archive/2011/08/04/2127250.html

  9. HW6.29

    public class Solution { public static void main(String[] args) { int count = 0; int[] card = new int ...

  10. 2016多校第六场题解(hdu5793&hdu5794&hdu5795&hdu5800&hdu5802)

    这场就做出一道题,怎么会有窝这么辣鸡的人呢? 1001 A Boring Question(hdu 5793) 很复杂的公式,打表找的规律,最后是m^0+m^1+...+m^n,题解直接是(m^(n+ ...