web-dev-qa-db-ja.com

AndroidのTabWidgetのカスタムスタイル

Androidアプリでタブを使用しています。HTCSense電話でアプリを実行すると、この問題が発生しました:

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>

そしてこれは、res/values/styles.xmlで定義したMyTabStyleの私の定義です。

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

MyTabStyleの変更がアプリに表示されないのはなぜですか? HTC Senseの選択されたタブの非表示テキストを解決するための他の解決策はありますか?

UPDATE 2011-06-02

私は、タブのテキストが実際にはTextViewであるという知識を使用して、これを一種のハックな方法で解決することができました。次のメソッドをアクティビティに追加します。

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);
        }
    });
}
14
andre

この人は、タブのすべてをかなりカスタマイズする方法を投稿しました。 Android 1.6以降: Custom Android Tabs で動作します。

私はまだ試していませんが、そこに着きました。基本的には、TabSpecでsetIndicatorを呼び出し、テキストだけでなくビューを渡します。次に、セレクターなどを使用してそのビューをカスタマイズできます。

11
Fraggle

> 14で引き続きTabWidgetsを使用している場合は、 http://code.google.com/p/Android/issues/detail?id=2267 を参照してください。最後のコメントはiosched2011を指しており、実際にそれらはTabIndicatorのビュー全体を置き換えます。いくつかのプロパティ(一般的な背景、テキスト)を除いて、単純な方法は壊れているようで、この複雑さが必要です。

2
pjv