5

すべてのスタイルをアプリのテーマに入れようとしています。ただし、TextView で textColor を変更するのに問題があります。これは私のattrs.xmlファイルからのものです。

<?xml version="1.0" encoding="utf-8"?>

<declare-styleable name="flat">
    <attr name="detail_name_view" format="reference" />

</declare-styleable>

これは私のstyles.xmlファイルからのものです

<style name="flat_theme" parent="android:Theme.NoTitleBar">
    <item name="detail_name_view">@style/flat_detail_name</item>
</style>
<style name="flat_detail_name" parent="@android:style/Widget.TextView">
    <item name="android:textAppearance">?android:attr/textAppearanceMedium</item>
    <item name="android:textColor">@color/detail_group_black</item>
    <item name="android:textSize">16sp</item> 
    <item name="android:singleLine">true</item>
    <item name="android:ellipsize">end</item>
</style>

そして、これは私のlayout.xmlファイルからのものです

    <TextView
        android:id="@+id/detail_name"
        style="?detail_name_view"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:layout_gravity="left|center_vertical"
        android:layout_marginLeft="5dp"
        android:layout_weight="1"
        android:gravity="left|center_vertical" />

また、マニフェストを次のように正しく設定しています。

    <application
    android:name="com.example.blah"
    android:icon="@drawable/blah"
    android:label="@string/app_name"
    android:theme="@style/flat_theme"

色が「@color/detail_group_black」に変更されることはありません。簡単なものがありませんか?または、Android が既に TextView の textColor 属性を作成しているという問題があり、それがスタイルがそれをオーバーライドしていない理由ですか? 私の属性テーマ戦略は、アプリの残りの部分ではうまく機能しているようですが、これはそうではありません. 何か案は?前もって感謝します。

また、この変更のためだけにカスタム TextView クラスを作成したくありません。これはかなり大きなプロジェクトであり、TextView をすべて拡張するとどのような問題が発生するかわかりません。

編集 また、TextView を style="@style/flat_detail_name_view" に変更すると、正常に動作します。私がそうしたくない理由は、テーマを変更するだけでこれらのテキストビューの外観を変更できるようにするためです。style="?something_else" を使用すると、他のすべてのビューで機能するため、これを本当に理解できず、単純なものが欠けている可能性がありますか?

4

1 に答える 1

2

誰かが同様の状況に遭遇した場合に備えて、私は自分の問題を見つけました! 基本的に、これが機能しなかった理由は、次のコードでビューを膨らませていたためです。

    private View buildGroupView(ExpandListGroup group) {
    LayoutInflater inf = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
    View view;
    switch(group.getType()){
        case ExpandListGroup.HEADER :
            view = inf.inflate(R.layout.three_col_header, null);
            break;
        default:
            view = inf.inflate(R.layout.detail_expandablelist_group_item, null);
            break;

    }

    return view;
}

そして、アダプターの getGroupView でそれを返していました。

    public View getGroupView(int groupPosition, boolean isLastChild, View convertView,
        ViewGroup parent) {
    View view = convertView;
    ExpandListGroup group = (ExpandListGroup) getGroup(groupPosition);

    view = buildGroupView(group);

    setGroupViewData(group, view);

    return view;
}

どうやら私の問題は、LayoutInflaterを置き換える必要があることでした

inf = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);

と ..

LayoutInflater inf = mActivity.getLayoutInflater();

この投稿の下部にある CommonsWare で提案されているように、ApplicationContext でインフレータを使用すると、テーマ/スタイルは適用されません

ご協力いただきありがとうございます。

于 2013-08-09T15:58:24.127 に答える