Intereting Posts

Почему мой пользовательский «actionBarTabStyle» не переопределяет стиль / тему по умолчанию?

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

Вот мои styles.xml

<!-- the theme applied to the application or activity --> <style name="CustomActionBarTheme" parent="@android:style/Theme.Holo"> <item name="android:tabWidgetStyle">@style/MyActionBarTabs</item> </style> <!-- ActionBar tabs styles --> <style name="MyActionBarTabs" parent="@android:style/Widget.Holo.ActionBar.TabView"> <!-- tab indicator --> <item name="android:background">@drawable/tabselector</item> </style>> 

Это мой tabselector.xml

 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Non focused states --> <item android:drawable="@drawable/tab_unselected_holo" android:state_focused="false" android:state_pressed="false" android:state_selected="false"/> <item android:drawable="@drawable/tab_selected_holo" android:state_focused="false" android:state_pressed="false" android:state_selected="true"/> <!-- Focused states --> <item android:drawable="@drawable/tab_unselected_focused_holo" android:state_focused="true" android:state_pressed="false" android:state_selected="false"/> <item android:drawable="@drawable/tab_selected_focused_holo" android:state_focused="true" android:state_pressed="false" android:state_selected="true"/> <!-- Pressed --> <!-- Non focused states --> <item android:drawable="@drawable/tab_unselected_pressed_holo" android:state_focused="false" android:state_pressed="true" android:state_selected="false"/> <item android:drawable="@drawable/tab_selected_pressed_holo" android:state_focused="false" android:state_pressed="true" android:state_selected="true"/> <!-- Focused states --> <item android:drawable="@drawable/tab_unselected_pressed_holo" android:state_focused="true" android:state_pressed="true" android:state_selected="false"/> <item android:drawable="@drawable/tab_selected_pressed_holo" android:state_focused="true" android:state_pressed="true" android:state_selected="true"/> </selector> 

Я добавил вкладки, используя TabHost в своей деятельности, и его макет выглядит так:

 <android.support.v4.app.FragmentTabHost xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/tabhost" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TabWidget android:id="@android:id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="0" android:orientation="horizontal" /> <FrameLayout android:id="@android:id/tabcontent" android:layout_width="0dp" android:layout_height="0dp" android:layout_weight="0" /> <FrameLayout android:id="@+id/realtabcontent" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> </LinearLayout> </android.support.v4.app.FragmentTabHost> 

Я следил за примерами на странице разработчика Android

Мои вкладки по-прежнему выглядят одинаково. Предполагается, что мои индикаторы вкладок – это мой собственный розовый цвет. Однако изменений нет, они все еще синие.

Что следует отметить:

  1. Мой файл манифеста ссылается на обновленную тему в тегах приложения
  2. Мой styles.xml обновляется в каждой папке значений (значения, значения-v11, значения-v14)
  3. Все это означало добавление панели действий поверх моего приложения с моим изображением и заголовком ic_launcher

Что мне не хватает или что-то не так? Цените любую помощь. Спасибо вам всем!

В вкладках в ActionBar используется другая тема, чем вкладки TabHost .

Все, что вам нужно сделать, это изменить android:actionBarTabStyle для android:tabWidgetStyle .

Полный пример

 <style name="Your.Theme" parent="@android:style/Theme.Holo.Light.DarkActionBar"> <item name="android:tabWidgetStyle">@style/Your.TabWidget</item> </style> <style name="Your.TabWidget" parent="@android:style/Widget.Holo.TabWidget"> <item name="*android:tabLayout">@layout/your_tab_layout</item> </style> <style name="Your.Tab" parent="@android:style/Widget.Holo.ActionBar.TabView"> <item name="android:background">@drawable/your_tab_indicator</item> <item name="android:layout_width">0dip</item> <item name="android:layout_weight">1</item> <item name="android:minWidth">80dip</item> </style> 

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" style="@style/Your.Tab" android:layout_height="?android:attr/actionBarSize" android:orientation="horizontal" > <ImageView android:id="@android:id/icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:visibility="gone" /> <TextView android:id="@android:id/title" style="@android:style/Widget.Holo.ActionBar.TabText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:maxWidth="180dip" /> </LinearLayout> 

Хотя, android:tabLayout не является публичным атрибутом (следовательно, *). Из-за этого Google не рекомендовал бы создавать такой стиль, а вместо этого предлагал бы динамически изменять индикатор. Итак, что-то вроде этого:

  final TabWidget tabWidget = tabHost.getTabWidget(); for (int i = 0; i < tabWidget.getTabCount(); i++) { final View tab = tabWidget.getChildTabViewAt(i); tab.setBackground(getResources().getDrawable(R.drawable.your_tab_indicator)); } 

Результаты

пример