2016-06-14 20 views
0

私は、ユーザがPreferenceActivityから複数の異なる色のテーマの中から選択し、それによってアプリケーション全体のテーマ/色を変更できるアプリケーションを持っています。しかし、PreferenceActivityで選択された変更はすぐには適用されません。変更は、ユーザPreferenceActivityに再入したときにのみ適用されます。アクティビティを再開せずにアンドロイドでテーマ/スタイルを適用するにはどうすればよいですか?

テーマが選択されるたびにrecreate()と呼ぶことができますが、アクティビティ全体を再作成することなく、より良い解決策が存在するかどうかを知りたいと思います。呼ばれる

@Override 
public void onCreate(Bundle savedInstanceState) { 
    setTheme(); 
    themecolorList.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { 
     @Override 
     public boolean onPreferenceChange(Preference preference, Object newValue) { 
      switch (themecolorList.getValue()) { 

       case "grey": 
        themecolorList.getEditor().putString("grey", "green").apply(); 
        break; 
       case "green": 
        themecolorList.getEditor().putString("green", "green").apply(); 
        setTheme(R.style.AppTheme_default); 
        break; 
       case "blue": 
        themecolorList.getEditor().putString("blue", "green").apply(); 
        break; 
       case "yellow": 
        themecolorList.getEditor().putString("yellow", "green").apply(); 
        break; 
       case "red": 
        themecolorList.getEditor().putString("red", "green").apply(); 
        break; 
       case "pink": 
        themecolorList.getEditor().putString("pink", "green").apply(); 
        break; 

       default: 
        themecolorList.getEditor().putString("green", "green").apply(); 
        break; 
      } 

      recreate(); 
      return true; 


     } 
    }); 
    } 

方法setTheme();:私は私のPreferenceActivityでpreferenceListから選択した値を設定する場所ですhttps://www.youtube.com/watch?v=oU8xIUi_48A

:ここ

は、現在どのように動作するかのビデオです私のPreferenceActivitys onCreate();メソッド

private void setTheme() { 

    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); 
    switch (sharedPreferences.getString("THEME_KEY", "green")) { 

     case "grey": 
      setTheme(R.style.AppTheme_Grey); 
      break; 

     case "green": 
      setTheme(R.style.AppTheme_default); 
      break; 

     case "blue": 
      setTheme(R.style.AppTheme_Blue); 
      break; 

     case "yellow": 
      setTheme(R.style.AppTheme_Yellow); 
      break; 

     case "red": 
      setTheme(R.style.AppTheme_Red); 
      break; 

     case "pink": 
      setTheme(R.style.AppTheme_Pink); 
      break; 

     default: 
      getApplication().setTheme(R.style.AppTheme_default); 
      setTheme(R.style.AppTheme_default); 
      break; 
    } 
} 

答えて

3

ベストソリューションはrecreate()です。

毎回のために

テーマ 押されたいずれかのキー/値のリストからオプションでユーザーを押すがSharedPreferencerecreate();OnPreferenceChangeListenerを経由して保存されます。活動のために全体のレイアウトを更新する他の方法はありませんので、次に呼び出されます。私PreferenceActivity秒で

themecolorList.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { 
     @Override 
     public boolean onPreferenceChange(Preference preference, Object newValue) { 
      recreate(); 
      return true; 
     } 
    }); 

私はrecreate();が呼ばれた後に呼び出されるカスタムメイドのメソッド呼び出しsetTheme();onCreate();setTheme();はちょうどOnPreferenceChangeListenerからSharedPreferenceに保存されているものを検索して) `(再作成使用して値

@Override 
public void onCreate(Bundle savedInstanceState) { 
    setTheme(); 
    super.onCreate(savedInstanceState); 
} 
0

できません。 テーマを選択するための新しいアクティビティを開始したり、ユーザーがそのアクティビティを終了するように選択したりすることができます。

+0

に対応するテーマを設定;'ユーザーを押すたびのための新たな意図を始めるよりも、その後、より良いオプションになります先物主義者のオプションで – Muddz

0

レイアウトの更新をトリガーする(デバイスを回転させるか、アプリが回転していると思うようにする)ことで、通常はリソースをリロードする必要があります。

私は現時点でどのように行うのか正確には覚えていませんが、前回私が似たようなことをする方法を調査したのは一般的な練習でした。 完全再起動(および保存されていないデータの損失)を避けるために、アクティビティがレイアウトの変更/画面の回転を処理することを(マニフェストでは?)忘れずに指定してください。

+0

クールな解決策として鳴ります。唯一のキャッチは、風景モードでの使用は実用的ではないので、私はPotraitモードでのみ動作するように自分のアプリケーションを作ったということです。 – Muddz

+0

母、私はあなたとまったく同じ問題を抱えていました! :p(http://stackoverflow.com/questions/11705963/forcing-a-different-locale-works-only-for-top-activity-in-back-stack/11710007#comment15537029_11710007)。 しかし、私はあなたが活動を再現することに悩まされていると思います。あるいは、可能であればプレビュー(イメージポップアップ、またはリストアイテムにスタイルカラーを適用することができます)をしてから、アクティビティを再作成するだけです。現在の状態を必要に応じて新しいインスタンスに追加します)。 – ToVine

0

再描画が必要なビューで呼び出すメソッドがinvalidate()のようです。あなただけの再描画する必要がある個々のビューに呼び出すことができるはずです

Link

。活動全体ではありません。

+0

'PreferenceActivity'または' AppCompatPreferenceActivity'には 'invalidateOptionsMenu();' invalidateHeaders();とどちらも動作しません – Muddz

+0

ああ、ごめんなさい。 – Buildersrejected

関連する問題