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两个变量),从而达到修改。

[java] view plain copy print ?
  1. package com.test.main; 
  2.  
  3. import java.lang.reflect.Field; 
  4.  
  5. import android.app.TabActivity; 
  6. import android.content.Intent; 
  7. import android.os.Build; 
  8. import android.os.Bundle; 
  9. import android.view.LayoutInflater; 
  10. import android.view.View; 
  11. import android.widget.TabHost; 
  12. import android.widget.TabWidget; 
  13. import android.widget.TextView; 
  14. import android.widget.TabHost.OnTabChangeListener; 
  15.  
  16. public class TabhostActivity extends TabActivity { 
  17. /** Called when the activity is first created. */ 
  18. @Override 
  19. public void onCreate(Bundle savedInstanceState) { 
  20. super.onCreate(savedInstanceState); 
  21. // setContentView(R.layout.main); 
  22.  
  23. int width =45
  24. int height =68
  25.  
  26. final TabHost tabs = getTabHost(); 
  27. final TabWidget tabWidget = tabs.getTabWidget(); 
  28.  
  29. Field mBottomLeftStrip; 
  30. Field mBottomRightStrip; 
  31.  
  32. LayoutInflater.from(this).inflate(R.layout.main, tabs.getTabContentView(), true); 
  33.  
  34. tabs.addTab(tabs.newTabSpec("first tab"
  35. .setIndicator("信息", getResources().getDrawable(android.R.drawable.ic_dialog_email)) 
  36. .setContent(new Intent(TabhostActivity.this,OneActivity.class)) 
  37. ); 
  38.  
  39. tabs.addTab(tabs.newTabSpec("second tab"
  40. .setIndicator("收藏",getResources().getDrawable(android.R.drawable.ic_menu_add)) 
  41. .setContent(new Intent(TabhostActivity.this,TwoActivity.class))); 
  42.  
  43. tabs.addTab(tabs.newTabSpec("third tab"
  44. .setIndicator("摄影",getResources().getDrawable(android.R.drawable.ic_menu_camera)) 
  45. .setContent(new Intent(TabhostActivity.this,ThreeActivity.class))); 
  46.  
  47. tabs.setCurrentTab(0); 
  48.  
  49. for (int i =0; i < tabWidget.getChildCount(); i++) { 
  50. /**
  51. * 设置高度、宽度,不过宽度由于设置为fill_parent,在此对它没效果
  52. */ 
  53. tabWidget.getChildAt(i).getLayoutParams().height = height; 
  54. tabWidget.getChildAt(i).getLayoutParams().width = width; 
  55.  
  56. /**
  57. * 设置tab中标题文字的颜色,不然默认为黑色
  58. */ 
  59. final TextView tv = (TextView) tabWidget.getChildAt(i).findViewById(android.R.id.title); 
  60.  
  61. tv.setTextColor(this.getResources().getColorStateList(android.R.color.white)); 
  62.  
  63. /**
  64. * 此方法是为了去掉系统默认的色白的底角
  65. *
  66. * 在 TabWidget中mBottomLeftStrip、mBottomRightStrip
  67. * 都是私有变量,但是我们可以通过反射来获取
  68. *
  69. * 由于Android 2.2,2.3的接口不同,加个判断
  70. */ 
  71.  
  72. if (Float.valueOf(Build.VERSION.RELEASE.substring(0, 3)) <= 2.1) { 
  73. try
  74. mBottomLeftStrip = tabWidget.getClass().getDeclaredField ("mBottomLeftStrip"); 
  75. mBottomRightStrip = tabWidget.getClass().getDeclaredField ("mBottomRightStrip"); 
  76. if(!mBottomLeftStrip.isAccessible()) { 
  77. mBottomLeftStrip.setAccessible(true); 
  78. if(!mBottomRightStrip.isAccessible()){ 
  79. mBottomRightStrip.setAccessible(true); 
  80. mBottomLeftStrip.set(tabWidget, getResources().getDrawable (R.drawable.no)); 
  81. mBottomRightStrip.set(tabWidget, getResources().getDrawable (R.drawable.no)); 
  82.  
  83. } catch (Exception e) { 
  84. e.printStackTrace(); 
  85. } else
  86.  
  87. //如果是2.2,2.3版本开发,可以使用一下方法tabWidget.setStripEnabled(false) 
  88. //tabWidget.setStripEnabled(false); 
  89.  
  90. //但是很可能你开发的android应用是2.1版本, 
  91. //tabWidget.setStripEnabled(false)编译器是无法识别而报错的,这时仍然可以使用上面的 
  92. //反射实现,但是需要修改代码 
  93.  
  94. try
  95. //2.2,2.3接口是mLeftStrip,mRightStrip两个变量,当然代码与上面部分重复了 
  96. mBottomLeftStrip = tabWidget.getClass().getDeclaredField ("mLeftStrip"); 
  97. mBottomRightStrip = tabWidget.getClass().getDeclaredField ("mRightStrip"); 
  98. if(!mBottomLeftStrip.isAccessible()) { 
  99. mBottomLeftStrip.setAccessible(true); 
  100. if(!mBottomRightStrip.isAccessible()){ 
  101. mBottomRightStrip.setAccessible(true); 
  102. mBottomLeftStrip.set(tabWidget, getResources().getDrawable (R.drawable.no)); 
  103. mBottomRightStrip.set(tabWidget, getResources().getDrawable (R.drawable.no)); 
  104.  
  105. } catch (Exception e) { 
  106. e.printStackTrace(); 
  107.  
  108. View vvv = tabWidget.getChildAt(i); 
  109. if(tabs.getCurrentTab()==i){ 
  110. vvv.setBackgroundDrawable(getResources().getDrawable(R.drawable.selected)); 
  111. else
  112. vvv.setBackgroundDrawable(getResources().getDrawable(R.drawable.green)); 
  113.  
  114. /**
  115. * 当点击tab选项卡的时候,更改当前的背景
  116. */ 
  117. tabs.setOnTabChangedListener(new OnTabChangeListener(){ 
  118. @Override 
  119. public void onTabChanged(String tabId) { 
  120. // TODO Auto-generated method stub 
  121. for (int i =0; i < tabWidget.getChildCount(); i++) { 
  122. View vvv = tabWidget.getChildAt(i); 
  123. if(tabs.getCurrentTab()==i){ 
  124. vvv.setBackgroundDrawable(getResources().getDrawable(R.drawable.selected)); 
  125. else
  126. vvv.setBackgroundDrawable(getResources().getDrawable(R.drawable.green)); 
  127. }}); 

你可能感兴趣的:(TabWidget去除底部下划线)