Ответ 1
Что делать, если вы регистрируете события TabHost.OnTabChanged и вызываете mTabHost.getCurrentTabView(), чтобы получить представление, а затем view.setBackgroundResource()?
Мой класс extends extends TabActivity
TabHost mTabHost = getTabHost();
TabHost.TabSpec tab1 =mTabHost.newTabSpec("tab1");
TabHost.TabSpec tab2 =mTabHost.newTabSpec("tab2");
tab1 .setIndicator("title tab1");
tab2 .setIndicator("title tab2");
mTabHost.addTab(tab1);mTabHost.addTab(tab2);
TabHost.setCurrentTab(0 or 1)
Может ли кто-нибудь указать мне, как изменить фоновое изображение или цвет выбранной вкладки?
Что делать, если вы регистрируете события TabHost.OnTabChanged и вызываете mTabHost.getCurrentTabView(), чтобы получить представление, а затем view.setBackgroundResource()?
Это установит цвета вашей вкладки:
public static void setTabColor(TabHost tabhost) {
for(int i=0;i<tabhost.getTabWidget().getChildCount();i++) {
tabhost.getTabWidget().getChildAt(i).setBackgroundColor(Color.parseColor("#FF0000")); //unselected
}
tabhost.getTabWidget().getChildAt(tabhost.getCurrentTab()).setBackgroundColor(Color.parseColor("#0000FF")); // selected
}
и если вы поместите его внутри onTabChangedListener(), он сохранит правильный цвет для выбранных вкладок.
Как упоминалось в mbaird, лучшим решением является использование фона с селектором, поэтому вам не нужно проверять onTabChanged
и выполнять ручное обновление. Минимальный код здесь:
private void initTabsAppearance(TabWidget tabWidget) {
// Change background
for(int i=0; i < tabWidget.getChildCount(); i++)
tabWidget.getChildAt(i).setBackgroundResource(R.drawable.tab_bg);
}
Где tab_bg
- это xml, который можно выбрать с помощью селектора:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:drawable="@drawable/tab_bg_selected" />
<item android:drawable="@drawable/tab_bg_normal" />
</selector>
Для полной настройки табуляции я добавлю код для изменения стиля текста табуляции с помощью настраиваемой темы. Добавьте это в styles.xml
:
<resources>
<style name="MyCustomTheme" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:tabWidgetStyle">@style/CustomTabWidget</item>
</style>
<style name="CustomTabWidget" parent="@android:style/Widget.TabWidget">
<item name="android:textAppearance">@style/CustomTabWidgetText</item>
</style>
<style name="CustomTabWidgetText" parent="@android:style/TextAppearance.Widget.TabWidget">
<item name="android:textSize">12sp</item>
<item name="android:textStyle">bold</item>
</style>
</resources>
Чтобы использовать эту тему, определите ее в AndroidManifest.xml:
<application android:theme="@style/MyCustomTheme">
И теперь у вас есть виджеты вкладок с настраиваемым фоном и настраиваемым текстовым стилем.
Помогает ли this решить вашу проблему? В основном вызов setBackgroundDrawable в каждом представлении вкладки с помощью селектора?
> TabHost mTabHost = getTabHost();
>
> TabHost.TabSpec tab1 =mTabHost.newTabSpec("tab1");
> TabHost.TabSpec tab2 =mTabHost.newTabSpec("tab2");
>
> tab1.setIndicator("title tab1");
> tab2.setIndicator("title tab2");
> mTabHost.addTab(tab1) ;mTabHost.addTab(tab2);
>
> TabHost.setCurrentTab(0 or 1);
mTabHost.getTabWidget().getChildAt(0).setBackgroundResource(R.drawable.tab1selector);
mTabHost.getTabWidget().getChildAt(1).setBackgroundResource(R.drawable.tab2selector);
mTabHost.getTabWidget().getChildAt(2).setBackgroundResource(R.drawable.tab3selector);
mTabHost.getTabWidget().getChildAt(3).setBackgroundResource(R.drawable.tab4selector);
Используйте .setBackgroundResource, а tabNselector - это XML-tabNselector.xml
<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="false" android:drawable="@drawable/tabN"/>
<item android:state_selected="true" android:drawable="@drawable/tabNsel" />
</selector>
Я установил параметр "android: background" в элементе TabWidget XML, чтобы получить общий фон всех вкладок.
Затем я передал представления, раздутые из другого XML в методе '.setIndicator'.
View v = LayoutInflater.from(this).inflate(R.layout.tab_widget, null);
TextView label = (TextView) v.findViewById(R.id.tabLabel);
label.setText("Whatever");
tab1 .setContent(v);
Я чувствую, что это лучший способ сделать это.