Используйте другой цвет для разных ActionBar.Tab

Я хочу, чтобы все вкладки в ActionBar имели разные индикаторы цвета, например синий для вкладки 1, красный для вкладки 2 и т. Д.

Для этого я создал разные селектора для всех цветов и поместил их в разные xmls в drawable. В style.xml я вызываю их

<style name="MyTheme" parent="AppBaseTheme"> <item name="android:actionBarTabStyle">@style/ActionBarTabStyleRed</item> </style> <style name="ActionBarTabStyleRed"> <item name="android:background">@drawable/tab_indicator_red</item> </style> 

Я создал этот стиль для разных цветов. Теперь, когда я изменяю drawable или стиль для другого цвета, он работает. Я могу видеть, что цвета применяются к вкладкам. Но так как все вкладки одного цвета, это не решило мою цель. Я попытался установить стиль вкладок в onTabSelected() но нет способа сделать это.

В конечном итоге я попытался создать разные темы для разных цветов и попытался установить их программно в onTabSelected() , но потом я узнал, что тема должна быть задана перед setContentView() .
Итак, мои вопросы … Как я могу это сделать? Есть ли способ иметь разные цвета для разных индикаторов вкладок ???

Обновить:-
Drawable / tab_indicator_red.xml

 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Non focused states --> <item android:state_focused="false" android:state_selected="false" android:state_pressed="false" android:drawable="@android:color/transparent" /> <item android:state_focused="false" android:state_selected="true" android:state_pressed="false" android:drawable="@drawable/tab_selected_red" /> <!-- Focused states --> <item android:state_focused="true" android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/tab_unselected_focused_red" /> <item android:state_focused="true" android:state_selected="true" android:state_pressed="false" android:drawable="@drawable/tab_selected_focused_red" /> <!-- Pressed --> <!-- Non focused states --> <item android:state_focused="false" android:state_selected="false" android:state_pressed="true" android:drawable="@drawable/tab_unselected_pressed_red" /> <item android:state_focused="false" android:state_selected="true" android:state_pressed="true" android:drawable="@drawable/tab_selected_pressed_red" /> <!-- Focused states --> <item android:state_focused="true" android:state_selected="false" android:state_pressed="true" android:drawable="@drawable/tab_unselected_pressed_red" /> <item android:state_focused="true" android:state_selected="true" android:state_pressed="true" android:drawable="@drawable/tab_selected_pressed_red" /> </selector> 

Я думаю, у меня есть отправная точка для вас, но это немного странно. При настройке панели действий с помощью следующего кода вы можете настроить вкладки для пользовательского вида:

  //...somewhere in oncreate ActionBar bar = getActionBar(); bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); ActionBar.Tab tab1 = bar.newTab(); TextView tv1 = createTab("Tab 1", R.drawable.firsttabdrawable); tab1.setCustomView(tv1); tab1.setTabListener(this); ActionBar.Tab tab2 = bar.newTab(); tab2.setCustomView(createTab("Tab 2", R.drawable.secondTabDrawable)); tab2.setTabListener(this); ActionBar.Tab tab3 = bar.newTab(); tab3.setCustomView(createTab("Tab 3", R.drawable.thirdTabDrawable)); tab3.setTabListener(this); ActionBar.Tab tab4 = bar.newTab(); tab4.setCustomView(createTab("Tab 4", R.drawable.fourthTabDrawable)); tab4.setTabListener(this); bar.addTab(tab1); bar.addTab(tab2); bar.addTab(tab3); bar.addTab(tab4); 

CreateTab следующим образом:

  private TextView createTab(String titleText, int tabBackgroundDrawableId) { TextView tv = new TextView(this); //set caption and caption appearance tv.setTextAppearance(this, R.style.MyDefaultTabTextAppearance); tv.setText(titleText); //set appearance of tab tv.setBackgroundResource(tabBackgroundDrawableId); tv.setLayoutParams(new android.view.ViewGroup.LayoutParams(android.view.ViewGroup.LayoutParams.MATCH_PARENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT)); //Make sure all tabs have the same height tv.setMaxLines(2); tv.setMinLines(2); return tv; } 

Однако, похоже, панель действий добавляет представление вкладки в родительское представление, которое добавляет дополнение для каждого из них, которое необходимо удалить. Я сделал это в oncreate после первого блока кода, например:

  View view = (View) tv1.getParent(); LinearLayout.LayoutParams lp = (android.widget.LinearLayout.LayoutParams)view.getLayoutParams(); view.setPadding(0, 0, 0, 0); view.setLayoutParams(lp); 

Вы можете найти более изящный / простой способ сделать это, но в качестве отправной точки я подумал, что это стоит публикации.

Надеюсь это поможет.

ДОБАВЛЕНО:

Также может быть полезно указать, что если у вас есть более сложный макет для вашей вкладки, вы можете раздуть XML-файл макета в методе createTab. Например, используя следующий xml (mytab.xml):

  <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tabIcon"/> <TextView style="@style/MyDefaultTabTextAppearance" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_toRightOf="@+id/tabIcon" android:minLines="2" android:maxLines="2" android:id="@+id/tabText"/> </RelativeLayout> 

CreateTab становится:

  private RelativeLayout createTab(String titleText, int tabBackgroundDrawableId) { RelativeLayout rl = (RelativeLayout)this.getLayoutInflater().inflate(R.layout.mytab, null, false); //set appearance of tab rl.setBackgroundResource(tabBackgroundDrawableId); TextView tv = (TextView)rl.findViewById(R.id.tabText); //set caption tv.setText(titleText); ImageView iv = (ImageView)rl.findViewById(R.id.tabIcon); iv.setImageResource(R.drawable.ic_launcher);//or supply unique drawable to method? return rl; }