3

アプリに設定からデータを読み取らせ、選択したオプションに応じてテーマを変更しようとしています。ここを含め、インターネット上でさまざまな提案を見つけましたが、機能させることができませんでした。

私は Preferences.xml と arrays.xml を作成しました。ユーザーは必要なテーマを選択できます。ただし、変更はアプリに反映されません。

ActivityMain.java の内容は次のとおりです。

public class MainActivity extends Activity {

 protected void onCreate(Bundle savedInstanceState) {
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
    String userTheme = preferences.getString("prefTheme", "darkab"); 
    if (userTheme.equals("darkab"))
        setTheme(R.style.darkab);
    else if (userTheme.equals("light"))
        setTheme(R.style.light);
    else if (userTheme.equals("dark"))
        setTheme(R.style.dark);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

@SuppressLint("NewApi")
protected void onResume(Bundle savedInstanceState) {
    recreate();
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
    String userTheme = preferences.getString("prefTheme", "darkab");
    if (userTheme.equals("darkab"))
        setTheme(R.style.darkab);
    else if (userTheme.equals("light"))
        setTheme(R.style.light);
    else {setTheme(R.style.dark);}
    super.onResume();
    setContentView(R.layout.activity_main);
}

これらは、styles.xml で設定されている、使用したいスタイルです。

<style name="darkab" parent="android:Theme.Holo.Light.DarkActionBar"></style>
<style name="light" parent="android:Theme.Holo.Light"></style>
<style name="dark" parent="android:Theme.Holo">

そして、ここに私のpreferences.javaファイルがあります:

public class Preferences extends PreferenceActivity {
@SuppressWarnings("deprecation")
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.preferences);
}

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

4

2 に答える 2

4

setTheme()レイアウトが構築される前にのみ有効です。つまり、前に呼び出す必要がありますsetContentView()。はLayoutInflaterテーマ属性を解決し、それに応じて、View作成する のプロパティを設定します。既に実行中のアクティビティにテーマを適用するには、アクティビティを再起動する必要があります。

于 2013-02-22T13:37:36.373 に答える
-1

遅れていることは承知していますが、ここに解決策を投稿したいと思います: ここ
で完全なソース コードを確認してください
これは、設定を使用してテーマを変更するときに使用したコードです..

SharedPreferences pref = PreferenceManager
            .getDefaultSharedPreferences(this);
String themeName = pref.getString("prefSyncFrequency3", "Theme1");
if (themeName.equals("Africa")) {
    setTheme(R.style.AppTheme);
} else if (themeName.equals("Colorful Beach")) {
    //Toast.makeText(this, "set theme", Toast.LENGTH_SHORT).show();
    setTheme(R.style.beach);
} else if (themeName.equals("Abstract")) {
    //Toast.makeText(this, "set theme", Toast.LENGTH_SHORT).show();
    setTheme(R.style.abstract2);
} else if (themeName.equals("Default")) {
    setTheme(R.style.defaulttheme);
}

setcontentview..の前にコードを配置する必要があることに注意してください。

于 2015-10-23T14:44:51.567 に答える