2017-04-04 11 views
0

アクティビティにはPreferenceFragmentが含まれています。ユーザーはこのアクティビティでアプリのスタイル(明るいテーマまたは暗いテーマ)を変更できます。今私は変更がすぐに見えるようにしたい。つまり、ユーザがPreferenceFragmentのスタイル設定を変更したときに、アクティビティのスタイルが変更されるようにします。アクティビティのスタイル設定をすぐに適用する

私の考えはPreferenceFragmentOnSharedPreferenceChangeListenerで嗜好の変更を聞き、アクティビティを再作成することでした。

しかし、私はこれが正しい方法だとは思わない。では、ここでベストプラクティスは何ですか?前もって感謝します。

UPDATE

活動:

public class SettingsActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    loadSettings(); 

    getFragmentManager().beginTransaction() 
     .replace(android.R.id.content, new SettingsFragment()) 
     .commit(); 
    } 

    private void loadSettings() { 
    SharedPreferences sharedPreferences = 
     PreferenceManager.getDefaultSharedPreferences(this); 

    boolean darkTheme = 
     sharedPreferences.getBoolean(getText(R.string.pref_theme_key).toString(), false); 

    if (darkTheme) { 
     setTheme(R.style.DarkTheme); 
    } 
    } 
} 

PreferenceFragment:

public class SettingsFragment extends PreferenceFragment 
    implements SharedPreferences.OnSharedPreferenceChangeListener { 

    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    addPreferencesFromResource(R.xml.preferences); 
    } 

    @Override 
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
    if (key.equals(getText(R.string.pref_theme_key))) { 
     // recreate Activity 
    } 
    } 
} 

設定:

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 
<CheckBoxPreference 
    android:defaultValue="false" 
    android:key="@string/pref_theme_key" 
    android:title="@string/pref_theme" /> 
</PreferenceScreen> 

答えて

0

I yを考えます我々のアプローチは正しい。その嗜好の変化を聞き、recreateあなたの活動。より多くのコンテキストの

編集:あなたの活動はがsetContentViewを呼び出す前に、このに基づいてコールsetThemeを作成したとき

あなたは、あなたの好みや中の明/暗バリアントとしてこれを保存しなければなりません。

+0

しかし、どのように 'PreferenceFragment'がそれが含まれているアクティビティを再作成できますか?問題をより明確にするために、私は質問を更新し、いくつかのコードを追加しました。 –

+0

'getActivity().recreate()'? –

+0

あまりにも簡単でした。私は木々の森を見ることができませんでした。どうもありがとうございました。ところで、リスナーの登録と登録解除も必要です。 –

関連する問題