Пользовательский стиль для Android TabWidget

Я использую вкладки в своем приложении для Android, и я столкнулся с этой проблемой при запуске приложения на телефонах HTC Sense:

Android: выделенная вкладка TabWidget не читается в HTC Sense

Решение, предлагаемое там (установка android: targetSdkVersion на 4), не устраняет проблему для меня, и я не хочу установить целевой SDK на 4.

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

Это код основного действия, удерживающий вкладки:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.tab);

    tabHost = getTabHost();
    tabHost.addTab(tabHost.newTabSpec("tab1").setIndicator("Tab 1").setContent(new Intent(this, Tab1.class)));
    tabHost.addTab(tabHost.newTabSpec("tab2").setIndicator("Tab 2").setContent(new Intent(this, Tab2.class)));

    tabHost.setCurrentTab(0);
}

Это мой tab.xml. Обратите внимание, что я указал MyTabStyle как стиль для TabWidget:

<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:padding="5dp">
        <TabWidget
            style="@style/MyTabStyle"
            android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:padding="5dp" />
    </LinearLayout>
</TabHost>

И это мое определение MyTabStyle, которое я определил в res/values ​​/styles.xml:

<style name="MyTabStyle" parent="@android:style/TextAppearance.Widget.TabWidget">
    <item name="android:textColor">#5DFC0A</item>
</style>

Почему в моем приложении не отображаются изменения в MyTabStyle? Любые другие решения для решения невидимого текста на выбранных вкладках в HTC Sense?

ОБНОВЛЕНИЕ 2011-06-02

Мне удалось решить это в каком-то хакерском ключе, используя знания о том, что текст на вкладках на самом деле является TextViews. Добавьте в свою деятельность следующий метод:

private void setTabColor(TabHost tabHost) {
    try {
        for (int i=0; i < tabHost.getTabWidget().getChildCount();i++) {
            TextView tv = (TextView) tabHost.getTabWidget().getChildAt(i).findViewById(android.R.id.title); //Unselected Tabs
            if (tv != null) {
                tv.setTextColor(Color.parseColor("#ffffff"));
            }
            TextView tv2 = (TextView) tabHost.getCurrentTabView().findViewById(android.R.id.title); // Selected Tab
            if (tv2 != null) {
                tv2.setTextColor(Color.parseColor("#000000"));
            }
        }
    } catch (ClassCastException e) {
        // A precaution, in case Google changes from a TextView on the tabs.
    }
}

Добавьте в свой метод onCreate() следующее:

// Only apply the fix if this is a HTC device.
if (android.os.Build.MANUFACTURER.toLowerCase().contains("htc")) {
    // Set up the color initially
    setTabColor(tabHost);

    // Add a tab change listener, which calls a method that sets the text color.
    tabHost.setOnTabChangedListener(new OnTabChangeListener() {
        public void onTabChanged(String tabId) {
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(tabHost.getApplicationWindowToken(), 0);
            setTabColor(tabHost);
        }
    });
}

Ответы

Ответ 1

Этот парень опубликовал способ настроить все о вкладке в значительной степени. Работает с Android 1.6 и выше: Пользовательские вкладки Android.

Я еще не пробовал, но попал туда. В основном вы вызываете setIndicator на свой TabSpec и передаете ему представление вместо простого текста. Затем вы можете настроить этот вид с помощью селекторов и т.д.

Ответ 2

Если вы все еще используете TabWidgets в > 14, см. http://code.google.com/p/android/issues/detail?id=2267. Последний комментарий указывает на iosched2011, и даже там они заменяют весь вид для TabIndicator. За исключением нескольких свойств (общий фон, текст), любой простой способ кажется сломанным, и эта сложность требуется.

Ответ 3

        

<!-- Focused states -->
<item android:state_focused="true" android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/tab_focus" />
<item android:state_focused="true" android:state_selected="true" android:state_pressed="false" android:drawable="@drawable/tab_focus" />

<!-- Pressed -->
<item android:state_pressed="true" android:drawable="@drawable/tab_press" />