更改ActionBar选项卡以编程方式强调颜色

我已经创build了操作栏

ActionBar actionbar = getActionBar() 

操作栏的背景被改变

 actionbar.setBackgroundDrawable(actionBarBackgroundImage); 

现在我需要更改操作栏选项卡下划线颜色编程。 是否有任何方法来更改操作栏选项卡下划线颜色?

Solutions Collecting From Web of "更改ActionBar选项卡以编程方式强调颜色"

或者,您可以使用Android Action Bar Style Generator轻松地为您的操作栏和选项卡提供主题。

这是一个更简单的方法。 我知道你正在寻找一个程序化的改变,但是这个真的很容易。

我一直在努力挣扎,但终于find了解决办法。 我正在使用AppCompat。 你可以在你的主题中设置colorAccent ,这将改变你的ActionBar的高亮颜色。 像这样:

 <item name="colorAccent">@color/highlightcolor</item> 

这里是在上下文中:

 <style name="LightTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <item name="colorPrimary">@color/darkgrey</item> <item name="colorPrimaryDark">@color/black</item> <item name="colorAccent">@color/highlightcolor</item> </style> 

我最初发布这个答案的位置: Android Tab下划线颜色不变

我会build议你使用ActionBarSherlock 。 库中有一个名为“Style ActionBar”的示例。 (这只是你可以改变ActionBar标签下划线的颜色)

如果您已经定制了ActionBar,那么您必须在ActionBar样式中添加此样式

或者这里是如何做到这一点

在这里输入图像说明

创build类似下面的样式(这里我已经使用了ActionBarShareLock,如果你不想使用然后使用android-support-v4.jar来支持所有的Android操作系统版本)

 <style name="Theme.AndroidDevelopers" parent="Theme.Sherlock.Light"> <item name="android:actionBarTabStyle">@style/MyActionBarTabStyle</item> <item name="actionBarTabStyle">@style/MyActionBarTabStyle</item> </style> <!-- style for the tabs --> <style name="MyActionBarTabStyle" parent="Widget.Sherlock.Light.ActionBar.TabBar"> <item name="android:background">@drawable/actionbar_tab_bg</item> <item name="android:paddingLeft">32dp</item> <item name="android:paddingRight">32dp</item> 

actionbar_tab_bg.xml

 <item android:state_focused="false" android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/ad_tab_unselected_holo" /> <item android:state_focused="false" android:state_selected="true" android:state_pressed="false" android:drawable="@drawable/ad_tab_selected_holo" /> <item android:state_selected="false" android:state_pressed="true" android:drawable="@drawable/ad_tab_selected_pressed_holo" /> <item android:state_selected="true" android:state_pressed="true" android:drawable="@drawable/ad_tab_selected_pressed_holo" /> 

将这种风格应用于Android清单文件中的活动

 <activity android:name="com.example.tabstyle.MainActivity" android:label="@string/app_name" android:theme="@style/Theme.AndroidDevelopers" > 

更多的细节检查这个答案和这篇文章 。


编辑:29-09-2015

ActionBarSherlock已弃用,所以或者你可以使用android design支持库和android应用程序appcompat库TOOLBAR(Action-Bar已被弃用,所以..)和TABS。

像下面这样使用TabLayout

 <android.support.design.widget.TabLayout android:id="@+id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content" app:tabGravity="center" app:tabMode="scrollable" app:tabSelectedTextColor="@color/white" app:tabIndicatorColor="@color/colorPrimary" app:tabIndicatorHeight="2dip" app:tabTextAppearance="?android:attr/textAppearanceMedium" app:tabTextColor="@color/colorAccent" /> 

这里是带有选项卡的androiddevise支持库的示例

参考这个 ,为自定义操作栏,

 <?xml version="1.0" encoding="utf-8"?> <resources> <!-- the theme applied to the application or activity --> <style name="CustomActivityTheme" parent="@android:style/Theme.Holo"> <item name="android:actionBarStyle">@style/MyActionBar</item> <!-- other activity and action bar styles here --> </style> <!-- style for the action bar backgrounds --> <style name="MyActionBar" parent="@android:style/Widget.Holo.ActionBar"> <item name="android:background">@drawable/ab_background</item> <item name="android:backgroundStacked">@drawable/ab_background</item> <item name="android:backgroundSplit">@drawable/ab_split_background</item> </style> </resources> 

我尝试了很多这里发布的build议和其他地方没有运气。 但是我想我已经设法拼凑出一个(虽然不是完美的)解决scheme。

TabWidget正在使用select器。 本质上,它显示一个不同的9补丁图像取决于选项卡的状态(select,按下等)。 我终于想通了,你可以编程生成一个select器。 我从http://android-holo-colors.com/生成了9个补丁(颜色:#727272,TabWidget:是)&#x3002;

最大的问题是设置颜色。 设置彩色滤光片什么也没做。 所以,我最终改变了循环内的9个补丁图像的每个像素的颜色。

 ... /** * <code>NinePatchDrawableUtility</code> utility class for manipulating nine patch resources. * * @author amossman * */ @TargetApi(Build.VERSION_CODES.HONEYCOMB) public class NinePatchDrawableUtility { // Matches the colors in the supported drawables private static final int TAB_UNDERLINE_HIGHLIGHT_COLOR = 1417247097; private static final int TAB_UNDERLINE_COLOR = -8882056; private static final int TAB_PRESSED_COLOR = -2122745479; private Resources resources; public NinePatchDrawableUtility(Resources resources) { this.resources = resources; } /** * Create a <code>StateListDrawable</code> that can be used as a background for the {@link android.widget.TabWidget}</br></br> * * <code> * FragmentTabHost tabHost = ...</br> * NinePatchUtility ninePatchUtility = new NinePatchUtility(getResources());</br> * TabWidget tabWidget = tabHost.getTabWidget();</br> * for (int i = 0; i < tabWidget.getChildCount(); i++) {</br> * &nbsp;&nbsp;&nbsp;tabWidget.getChildAt(i).setBackground(ninePatchUtility.getTabStateListDrawable(titleColor));</br> * } * </code> * * @param tintColor The color to tint the <code>StateListDrawable</code> * @return A new <code>StateListDrawable</code> that has been tinted to the given color */ public StateListDrawable getTabStateListDrawable(int tintColor) { StateListDrawable states = new StateListDrawable(); states.addState(new int[] {android.R.attr.state_pressed}, changeTabNinePatchColor(resources, R.drawable.cc_tab_selected_pressed_holo, tintColor)); states.addState(new int[] {android.R.attr.state_focused}, changeTabNinePatchColor(resources, R.drawable.cc_tab_selected_focused_holo, tintColor)); states.addState(new int[] {android.R.attr.state_selected}, changeTabNinePatchColor(resources, R.drawable.cc_tab_selected_holo, tintColor)); states.addState(new int[] { }, changeTabNinePatchColor(resources, R.drawable.cc_tab_unselected_holo, tintColor)); return states; } /** * Change the color of the tab indicator.</br></br> * * Supports only the following drawables:</br></br> * * R.drawable.cc_tab_selected_pressed_holo</br> * R.drawable.cc_tab_selected_focused_holo</br> * R.drawable.cc_tab_selected_holo</br> * R.drawable.cc_tab_unselected_holo</br></br> * * Note: This method is not efficient for large <code>Drawable</code> sizes. * * @param resources Contains display metrics and image data * @param drawable The nine patch <code>Drawable</code> for the tab * @param tintColor The color to tint the <code>Drawable</code> * @return A new <code>NinePatchDrawable</code> tinted to the given color */ public NinePatchDrawable changeTabNinePatchColor(Resources resources, int drawable, int tintColor) { int a = Color.alpha(tintColor); int r = Color.red(tintColor); int g = Color.green(tintColor); int b = Color.blue(tintColor); BitmapFactory.Options opt = new BitmapFactory.Options(); opt.inMutable = true; Bitmap bitmap = BitmapFactory.decodeResource(resources, drawable, opt); for (int x = 0; x < bitmap.getWidth(); x++) { for (int y = 0; y < bitmap.getHeight(); y++) { int color = bitmap.getPixel(x, y); if (color == TAB_PRESSED_COLOR) { bitmap.setPixel(x, y, Color.argb((int)(a * 0.5), r, g, b)); } else if (color == TAB_UNDERLINE_HIGHLIGHT_COLOR) { bitmap.setPixel(x, y, Color.argb((int)(a * 0.9), r, g, b)); } else if (color == TAB_UNDERLINE_COLOR) { bitmap.setPixel(x, y, tintColor); } } } return new NinePatchDrawable(resources, bitmap, bitmap.getNinePatchChunk(), new Rect(), null); } } 

使用示例:

 /** * Theme the tab widget with the defined background color and title color set * in the TabManager * @param tabWidget */ @SuppressWarnings("deprecation") @SuppressLint("NewApi") public void theme(TabWidget tabWidget) { ColorDrawable backgroundDrawable = new ColorDrawable(backgroundColor); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { tabWidget.setBackground(backgroundDrawable); tabWidget.setAlpha(0.95f); } else { backgroundDrawable.setAlpha(242); tabWidget.setBackgroundDrawable(backgroundDrawable); } NinePatchDrawableUtility ninePatchUtility = new NinePatchDrawableUtility(resources); for (int i = 0; i < tabWidget.getChildCount(); i++) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { tabWidget.getChildAt(i).setBackground(ninePatchUtility.getTabStateListDrawable(titleColor)); } else { tabWidget.getChildAt(i).setBackgroundDrawable(ninePatchUtility.getTabStateListDrawable(titleColor)); } View tabView = tabWidget.getChildTabViewAt(i); tabView.setPadding(0, 0, 0, 0); TextView tv = (TextView) tabView.findViewById(android.R.id.title); tv.setSingleLine(); // set the texts on the tabs to be single line tv.setTextColor(titleColor); } } 

在search1天之后find了更改标签荧光笔颜色的解决scheme。只需2行代码就可以完成这项工作!

转到values / styles.xml并在ActionBar主题中添加下面的代码

<item name="colorAccent">@color/Tab_Highlighter</item>

现在在colors.xml中给出Tab_Highlighter的颜色

 <color name="Tab_Highlighter">#ffffff</color> 

尝试下面。

在res / drawable中写tab_selector_green.xml。

  <!-- Non focused states --> <item android:drawable="@android:color/transparent" android:state_focused="false" android:state_pressed="false" android:state_selected="false"/> <item android:drawable="@drawable/layer_bg_selected_tabs_green" android:state_focused="false" android:state_pressed="false" android:state_selected="true"/> <!-- Focused states --> <item android:drawable="@android:color/transparent" android:state_focused="true" android:state_pressed="false" android:state_selected="false"/> <item android:drawable="@drawable/layer_bg_selected_tabs_green" android:state_focused="true" android:state_pressed="false" android:state_selected="true"/> <!-- Pressed --> <!-- Non focused states --> <item android:drawable="@android:color/transparent" android:state_focused="false" android:state_pressed="true" android:state_selected="false"/> <item android:drawable="@drawable/layer_bg_selected_tabs_green" android:state_focused="false" android:state_pressed="true" android:state_selected="true"/> <!-- Focused states --> <item android:drawable="@android:color/transparent" android:state_focused="true" android:state_pressed="true" android:state_selected="false"/> <item android:drawable="@drawable/layer_bg_selected_tabs_green" android:state_focused="true" android:state_pressed="true" android:state_selected="true"/> 

在res / drawable文件夹中写入layer_bg_selected_tabs_green.xml。

 <item> <shape android:shape="rectangle" > <solid android:color="@color/tab_green" /> <padding android:bottom="5dp" /> </shape> </item> <item> <shape android:shape="rectangle" > <solid android:color="#FFFFFF" /> </shape> </item> 

并在java代码中写这个。

 private static final int[] TABS_BACKGROUND = { R.drawable.tabs_selector_orange, R.drawable.tabs_selector_green, R.drawable.tabs_selector_red, R.drawable.tabs_selector_blue, R.drawable.tabs_selector_yellow }; /* BLA BLA BLA */ @Override public void onTabSelected(Tab tab, FragmentTransaction ft) { // TODO Auto-generated method stub RelativeLayout tabLayout = (RelativeLayout) tab.getCustomView(); tabLayout.setBackgroundResource(TABS_BACKGROUND[tab.getPosition()]); tab.setCustomView(tabLayout); /* ... */ } 

你可以使用这个代码:

actionBar.setStackedBackgroundDrawable(new ColorDrawable(yourColor));