簡體   English   中英

優化夜間模式系統

[英]Optimize night mode system

我在我的應用程序中創建了一個日/夜模式切換系統。 目前,我使用 PreferenceFragmentCompat + SharedPreference 來顯示和保存開關選擇。

這是我的代碼:

public class PreferencesActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_preferences);

        PreferencesFragment preferencesFragment = new PreferencesFragment();
        getSupportFragmentManager().beginTransaction().replace(R.id.preferences_container, preferencesFragment).commit();

    }


    public static class PreferencesFragment extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener {
        @Override
        public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
            setPreferencesFromResource(R.xml.preferences, rootKey);
        }


        @Override
        public void onResume() {
            super.onResume();
            getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);

        }

        @Override
        public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
            if (isAdded()) {
                if (sharedPreferences.getBoolean(getString(R.string.KEY_PREF_NIGHT_MODE), false)) {
                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
                } else {
                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
                    
                }
            }
        }
    }

}

最重要的是,我在主 Activity 的OnCreate方法中使用了以下代碼:

        PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
        sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);

        int mode = sharedPreferences.getBoolean(getString(R.string.KEY_PREF_NIGHT_MODE), false) ? AppCompatDelegate.MODE_NIGHT_YES : AppCompatDelegate.MODE_NIGHT_NO;
        if (AppCompatDelegate.getDefaultNightMode() != mode)
            AppCompatDelegate.setDefaultNightMode(mode);

問題是,當我激活暗模式並重新啟動應用程序時,它將啟動然后在onCreate中重新啟動。 難道沒有更優化的方式來實現這個系統嗎?

您可以在設置夜間模式的地方創建BaseActivity

abstract class BaseActivity extends AppCompatActivity {

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

        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY);
    }
}

然后從Activites擴展您的所有BaseActivity

public class PreferencesActivity extends BaseActivity {

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

        ...
    }
}

那么您的夜間模式將在setContentView之前的每個活動中設置,並且不會重新啟動

更新

改變

 @Override
 public void onResume() {
    super.onResume();
        getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
 }

@Override
public void onStart() {
    super.onStart();
        getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}

在視圖可見之前onStart

更新 2

這是訪問SharedPreferences的 singleton

public class SharedManager {

    private static SharedManager instance;
    private final SharedPreferences preferences;

    private SharedManager() {
        preferences = MyApplication.getAppContext().getSharedPreferences(Constants.PREF_NAME, Context.MODE_PRIVATE);
    }

    public static SharedManager getInstance() {
        if (instance == null) {
            synchronized (SharedManager.class) {
                if (instance == null) {
                    instance = new SharedManager();
                }
            }
        }
        return instance;
    }

    public SharedPreferences getPreferences() {
        return preferences;
    }
}

通過調用SharedManager.getInstance().getPreferences()您可以訪問 Preferences

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM