13

アプリで PreferenceActivity のテーマを変更しようとしていますが、うまく動作しません。

これはxmlです:

    <?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >

        <SwitchPreference android:title="Auto Clear" android:key="autoclear" android:summary="Clear the command line when the code is being executed." android:defaultValue="false"/>
        <ListPreference android:title="Choose a theme" android:negativeButtonText="" android:dialogTitle="" android:key="theme" android:entries="@array/themesList" android:entryValues="@array/themesList" android:defaultValue="Default" />

</PreferenceScreen>

そして、これは PreferenceActivity です:

    @Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);

    this.setTheme(R.style.AppTheme);

    addPreferencesFromResource(R.xml.preferences);

}

結果は次のとおりです。

結果

4

5 に答える 5

18

マニフェストのアクティビティ タグにテーマを適用してみましたか? これは私が以前にやった方法です -

<activity 
  android:label="@string/app_name" 
  android:name="com.example.MyPreferenceActivity"
  android:theme="@android:style/Theme.Black"
  android:exported="true"
  android:icon="@drawable/ic_launcher"></activity>

編集:

あなたが試すことができる他のオプションは、オーバーライドすることonApplyThemeResource(Resources.Theme theme, int resid, boolean first)です。Android ソース コードを見ると、setTheme は内部的にメソッドを呼び出します。

/**
 * Called by {@link #setTheme} and {@link #getTheme} to apply a theme
 * resource to the current Theme object.  Can override to change the
 * default (simple) behavior.  This method will not be called in multiple
 * threads simultaneously.
 *
 * @param theme The Theme object being modified.
 * @param resid The theme style resource being applied to <var>theme</var>.
 * @param first Set to true if this is the first time a style is being
 *              applied to <var>theme</var>.
 */
protected void onApplyThemeResource(Resources.Theme theme, int resid, boolean first) {
    theme.applyStyle(resid, true);
}
于 2012-08-01T01:48:24.363 に答える
10

最後に、「PreferenceActivity」のテーマをプログラムで(Javaコード経由で)変更する方法を見つけました

テーマを変更するには、次のようにします。

        @Override
        public void onCreate(Bundle savedInstanceState) {
        setTheme(R.style.Holo_Theme_Light);
        super.onCreate(savedInstanceState);
        }

常にメソッドのsetTheme(R.style.yourtheme);前にsuper.onCreate(savedInstanceState);メソッドを呼び出します。これを実行すると、下図のような結果が得られます。

ここに画像の説明を入力

それで全部です。

setTheme(R.style.yourtheme);メソッドの後にメソッドを呼び出すとsuper.onCreate(savedInstanceState);、以下に示すような結果が生成されます。

ここに画像の説明を入力

注: テーマは、ネストされた PreferenceScreen では認識されません。そのネストされた PreferenceScreen にテーマを適用するには、そのネストされた PreferenceScreen の別の PreferenceActivity を作成し、setTheme(R.style.yourtheme);そこでメソッドを呼び出す必要があります。

于 2013-03-27T10:11:52.010 に答える
4

背景を変更したい場合は、使用できます

public class FractalPreferenceActivity extends PreferenceActivity  {
   .......

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().setBackgroundDrawableResource(R.drawable.gradient); 
    getListView().setBackgroundColor(Color.TRANSPARENT); 
    getListView().setCacheColorHint(Color.TRANSPARENT); 

           .......
    }

}

于 2012-08-01T09:44:05.790 に答える
0

これはばかげているように聞こえるsetTheme()かもしれませんが、使用するとすべてのフラグメントで機能しますが、メインの設定アクティビティでは機能しません。これをマニフェスト ファイルに設定すると、突然動作するようになります。

ユーザー設定に基づいてテーマを動的に設定しsetTheme()、 from テーマ マネージャー オブジェクトの前に呼び出しonCreateます (また、さまざまな色を提供drawablesし、スタイルに設定したくないテーマによって変更することができます ... 主に混乱しすぎるため)何が何であるかを理解するため)。

マニフェストに設定すると機能する理由がわかりませんsetTheme()。私が推測する設定アクティビティに固有の不具合です。

于 2015-05-18T06:12:46.510 に答える