采用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. c#字符串及数组操作

    字符串操作(取当前时间)string time=convert.tostring(DateTime.Today).split( new char []{' '});    textbox1.text= ...

  2. Session简介

    摘要:虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本质,以至不能正确的应用这一技术.本文将详细讨论session的工作机制并且对在Java ...

  3. PSR-4——新鲜出炉的PHP规范

    FIG 制定的PHP规范,简称PSR,是PHP开发的事实标准. PSR原本有四个规范,分别是: PSR-0 自动加载 PSR-1 基本代码规范 PSR-2 代码样式 PSR-3 日志接口 2013年底 ...

  4. NGINX(三)HASH表

    前言 nginx的hash表有几种不同的种类, 不过都是以ngx_hash_t为基础的, ngx_hash_t是最普通的hash表, 冲突采用的是链地址法, 不过这里冲突的元素不是一个链表, 而是一个 ...

  5. 【Python】使用python的tornado配合html页面示例

    背景:java写的非标加密算法,测试时执行java工程进行解密测试,很不方便. 目的:想写个web页面,使得任何测试人员都可以在输入加密串时得到解密后字段,方便日志查询及字段核对.(额,算法部分就不写 ...

  6. Travel(HDU 4284状压dp)

    题意:给n个城市m条路的网图,pp在城市1有一定的钱,想游览这n个城市(包括1),到达一个城市要一定的花费,可以在城市工作赚钱,但前提有工作证(得到有一定的花费),没工作证不能在该城市工作,但可以走, ...

  7. 《零成本实现Web自动化测试--基于Selenium》 第五章 Selenium-RC

    一. 简介 Selenium-RC可以适应更复杂的自动化测试需求,而不仅仅是简单的浏览器操作和线性执行.Selenium-RC能够充分利用编程语言来构建更复杂的自动化测试案例,例如读写文件.查询数据库 ...

  8. IE兼容性问题解决方案2--css样式兼容标签

    在页面中加入下面的标签: <meta http-equiv = "x-UA-compatible" content="IE=edge,chrome=1"& ...

  9. 计算N的阶层

    int factorial(int n) { int i, result; ; i <= n; i++) result *= i; return result; } int factorial2 ...

  10. HDU 1698 Just a Hook 区间更新 lazy标记

    lazy标记 #include <iostream> #include <cstdio> #include <cstring> #include <sstre ...