web-dev-qa-db-ja.com

参照されたスタイル属性のオーバーライド

テーマ属性への参照 を読んだ後、設定したカスタムテーマの属性の値を参照しようとしています。

ユーザー定義のスタイルをCheckedTextViewに適用しています

_<CheckedTextView
    Android:id="@+id/contactInfo"
    style="@style/ListViewCheckedTextViewRowStyle" >
</CheckedTextView>
_

ユーザー定義のスタイルは次のように定義されます。

_<style name="ListViewCheckedTextViewRowStyle" parent="@style/ListViewRowStyle">
    <item name="Android:checkMark">?android:listChoiceIndicatorMultiple</item>
</style>
_

私が作成したテーマは次のように定義されています:

_<style name="Theme.Yellowgreen" parent="Android:Theme.Holo.Light.DarkActionBar">
    <item name="Android:listChoiceIndicatorMultiple">@drawable/btn_check_holo_light</item>
</style>
_

ただし、表示されるcheckMarkスタイルは、デバイスのデフォルトテーマのドローアブルであり、ユーザー定義のドローアブルではありません。

ドローアブルを表示する唯一の方法は、次の方法です。

_<style name="ListViewCheckedTextViewRowStyle" parent="@style/ListViewRowStyle">
    <item name="Android:checkMark">@drawable/btn_check_holo_light</item>
</style>
_

しかし、特に複数のテーマでこの属性をオーバーライドしたいので、これはこの属性をオーバーライドするという目的全体を無効にします。

ActivityonCreate()メソッドで次のようにテーマを設定しています。

_public void onCreate(Bundle savedInstanceState) {
    this.setTheme(R.style.Theme_Yellowgreen);
    super.onCreate(savedInstanceState);
    // ...
}
_

また、AndroidManifest.xmlファイルに次のようなテーマを設定しようとしました。

_<application Android:theme="@style/Theme.Yellowgreen" >
_

しかし、それはうまくいきませんでした。何がうまくいかない可能性がありますか?

更新

小さなサンプルプロジェクトを作成しましたが、上記で投稿したコードが機能しているようです。したがって、このプロパティをオーバーライドする他のスタイルが必要です。または、レイアウトxmlファイルに関係している可能性があります。

私の大規模なプロジェクトでは、Fragments内に2つのActivityがあります。両方のFragmentsにはListviewsAdaptersに支えられています。 _Fragment A_では、AdaptergetView()メソッドは次のとおりです。

_public View getView(final int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.contact_entry, null);
    }

    //...

    return convertView;
}
_

_Fragment B_では、AdaptergetView()メソッドは次のとおりです。

_public View getView(final int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.list_item, parent, false);
    }

    //...

    return convertView;
}
_

レイアウトは次のように定義されています。

list_item.xml

_<?xml version="1.0" encoding="utf-8"?>
<LinearLayout  xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/list_item"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:orientation="vertical">

    <include layout="@layout/list_item_header" />

    <include layout="@layout/contact_entry" />

    <View Android:id="@+id/list_divider"
        Android:layout_width="match_parent"
        Android:layout_height="1dp"
        Android:background="@Android:drawable/divider_horizontal_dark" />

</LinearLayout>
_

list_item_header.xml

_<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/header_text"
    Android:layout_width="match_parent"
    Android:layout_height="25dip"
    Android:background="@color/dark_blue"
    Android:gravity="center_vertical"
    Android:paddingLeft="6dip"
    Android:textColor="@color/white"
    Android:textSize="14sp"
    Android:textStyle="bold" />
_

contact_entry.xml

_<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/contactEntry"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:minHeight="?android:attr/listPreferredItemHeight"
    Android:orientation="horizontal" >

    <QuickContactBadge
        Android:id="@+id/contactPic"
        style="@style/ContactPicStyle" />

    <CheckedTextView
        Android:id="@+id/contactInfo"
        style="@style/ListViewCheckedTextViewRowStyle" >
    </CheckedTextView>

</LinearLayout>
_

何らかの理由で、_Fragment B_ではテーマのcheckMark属性が正しくレンダリングされませんが、_Fragment A_では、checkMarkは現在のYellowGreenテーマを使用し、正しくスタイル設定されます。なぜこれが起こっているのでしょうか?

9
toobsco42

テーマにその行が必要だと思います

<item name="Android:checkedTextViewStyle">@style/ListViewCheckedTextViewRowStyle</item>

したがって、次のようになります。

<style name="Theme.Yellowgreen" parent="Android:Theme.Holo.Light.DarkActionBar">
    <item name="Android:listChoiceIndicatorMultiple">@drawable/btn_check_holo_light</item>
    <item name="Android:checkedTextViewStyle">@style/ListViewCheckedTextViewRowStyle</item>
</style>

[〜#〜]更新[〜#〜]

質問の更新といくつかの追加情報フォームのコメントの後、問題はContextにあることがわかりました。それは私の質問で私がしたのと同じ間違いです: Androidカラーセレクターはカスタム属性では機能しません

一方のフラグメントにはActivityが渡され、もう一方のフラグメントにはApplicationが渡されました。私は専門家ではありませんが、これらのクラスの両方でさえContextを拡張しています。ActivityContextThemeWrapperを拡張し、スタイルに関する情報があります。コンテキストを将来理解するために、その記事を読むと役立つ場合があります: http://www.doubleencore.com/2013/06/context/

11
Mikooos