1

マニフェストで現在選択されているテーマに基づいて、各要素に適用されるスタイルを制御するために、Android アプリでテーマを使用しています。

任意の 1 つのテーマ (多くの場合があります) 内には、実行時に切り替えたいスタイルが多数あります。たとえば、テキストが通常どのように見えるかを定義するスタイルと、コードが間違って入力されたときに同じテキストがどのように見えるかを定義する別のスタイルがあります。

これはテーマによって決まるため、@style を直接参照することはできません。

私の問題を説明するためにサンプル アプリを作成しました (以下のスニペットでは、関係のない部分が省略されていることに注意してください)。

Attrs.xml: (カスタム リソースが参照するため、レイアウトはスタイルを直接参照しません)

<resources>
    <attr name="theme_style_one" format="reference" />
    <attr name="theme_style_two" format="reference" />
</resources>

Themes.xml: (テーマに基づいて適用する適切なスタイルを選択します)

<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="ThemeOne" parent="android:Theme">
    <item name="theme_style_one">@style/blue</item>
    <item name="theme_style_two">@style/red</item>
</style>

<style name="ThemeTwo" parent="android:Theme">
    <item name="theme_style_one">@style/green</item>
    <item name="theme_style_two">@style/red</item> 
</style>
</resources>

Styles.xml (スタイル自体)

<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <style name="blue">
        <item name="android:textColor">@color/color_blue</item>
    </style>

    <style name="red">
        <item name="android:textColor">@color/color_red</item>
    </style>

    <style name="green">
        <item name="android:textColor">@color/color_green</item>
    </style>
</resources>

Colors.xml (一部の色のみ)

<resources>
      <color name="color_blue">#0000FF</color>
      <color name="color_green">#00FF00</color>
      <color name="color_red">#FF0000</color>
</resources>

activity_main レイアウト:

<TextView
    android:id="@+id/txt_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:text="@string/hello_world"
    style="?theme_style_one" />

activity_main の onCreate:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    TextView textView = (TextView)findViewById(R.id.txt_text);
    textView.setTextAppearance(this, R.attr.theme_style_two);
}

私が達成したいのは、TextView のスタイルをプログラムで「theme_style_two」に変更することです。「SetTextAppearance」コマンドは効果がありません。マニフェストでテーマを変更すると、不適切なスタイルが適用されるため、このコマンドで @style/blue を直接参照することはできません。

どんな助けでも大歓迎です!

4

1 に答える 1

0
    /**
     * Gets a colour attribute for the specified theme attribute
     * 
     * @param The activity context so we can get the theme
     * @param themeAttr The theme attribute we want to get the style attribute for (e.g. R.attr.text_small)
     * @param styleAttr The attribute of the style that we want to get the value for (e.g. android.R.attr.textColor)
     * @return The resource ID of the colour (default is black if the style attribute can't be found)
     */
    public static int GetColourFromThemeAttribute(Context c, int themeAttr, int styleAttr)
    {
        // Get the resource ID of the style that the attribute references for the current theme
        TypedValue typedValue = new TypedValue();
        c.getTheme().resolveAttribute(themeAttr, typedValue, true);

        // Define an array of attributes we want to get from the style
        int[] attributes = new int[] { styleAttr };

        // Get the style attributes from the style that the theme attribute references
        TypedArray a = c.obtainStyledAttributes(typedValue.data, attributes);

        // Get the colour from the list of style attributes
        int colour = a.getColor(0, Color.BLACK);

        // Release the typed array
        a.recycle();

        return colour;
    }
于 2014-05-07T08:22:09.127 に答える