私は実際に私のアプリケーションにこの機能を持っており、さらに、ユーザーが実行時にテーマを変更できるようにしています。設定から値を読み取るには時間がかかるため、キャッシュされた値を保持するグローバルにアクセス可能な関数を介してテーマIDを取得しています。
すでに指摘したように、このガイドを使用して、いくつかのAndroidテーマを作成します。ファイルには少なくとも2つの<style>
アイテムが含まれますstyles.xml
。例えば:
<style name="Theme.App.Light" parent="@style/Theme.Light">...</style>
<style name="Theme.App.Dark" parent="@style/Theme">...</style>
ここで、これらのスタイルの1つをアクティビティに適用する必要があります。onCreate
他の呼び出しの前に、私はactivitieのメソッドでこれを行っています:
setTheme(MyApplication.getThemeId());
getThemeId
キャッシュされたテーマIDを返すメソッドです。
public static int getThemeId()
{
return themeId;
}
このフィールドは別の方法で更新されています:
public static void reloadTheme()
{
themeSetting = PreferenceManager.getDefaultSharedPreferences(context).getString("defaultTheme", "0");
if(themeSetting.equals("0"))
themeId = R.style.Theme_Light;
else
themeId = R.style.Theme_Dark;
}
これは、設定が変更されるたびに(そしてもちろん起動時に)呼び出されます。これらの2つのメソッドはMyApplication
、を拡張するクラスに存在しますApplication
。プリファレンス変更リスナーは、この投稿の最後に説明されており、メインアクティビティクラスにあります。
最後の非常に重要なこと-アクティビティが開始されるときにテーマが適用されます。テーマは設定画面でのみ変更でき、そこに到達する方法は1つしかないと仮定します。つまり、1つの(メイン)アクティビティからのみ、設定画面を終了してもこのアクティビティは再開されません。古いテーマは引き続き使用されます。使用済み。これを修正します(メインアクティビティを再開します)。
@Override
protected void onResume() {
super.onResume();
if(schduledRestart)
{
schduledRestart = false;
Intent i = getBaseContext().getPackageManager().getLaunchIntentForPackage( getBaseContext().getPackageName() );
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
}
}
scheduledRestart
はブール変数で、最初はfalseに設定されています。このリスナーによってテーマが変更されると、trueに設定されます。これにより、前述のキャッシュされたテーマIDも更新されます。
private class ThemeListener implements OnSharedPreferenceChangeListener{
@Override
public void onSharedPreferenceChanged(SharedPreferences spref, String key) {
if(key.equals("defaultTheme") && !spref.getString(key, "0").equals(MyApplication.getThemeSetting()))
{
MyApplication.reloadTheme();
schduledRestart = true;
}
}
sp = PreferenceManager.getDefaultSharedPreferences(this);
listener = new ThemeListener();
sp.registerOnSharedPreferenceChangeListener(listener);
リスナーオブジェクトへの参照を保持することを忘れないでください。そうしないと、ガベージコレットされます(そして機能しなくなります)。