如何使用preferenceChange更改所有活动的背景?

时间:2019-07-07 10:09:46

标签: java android android-fragments sharedpreferences android-preferences

我的android设置活动中有一个复选框。我想通过preferenceCheckBox值的更改来更改应用程序所有活动的背景色。

我的代码:

SettingsFragment.java

public class SettingsFragment extends PreferenceFragmentCompat {
    private SharedPreferences.OnSharedPreferenceChangeListener preferenceChangeListener;
    @Override
    public void onCreatePreferences(Bundle bundle, String s) {
        addPreferencesFromResource(R.xml.preference);

        preferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
            @Override
            public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
                if( key.equals("pref_light")){
                    Preference p = findPreference(key);
                    //i don't know how to change the background with the provided change !
                }
            }
        };

    }

我的问题 我想学习如何通过听过的偏好更改来更改所有活动的背景。假设我只有一项主要活动和一项设定活动。

3 个答案:

答案 0 :(得分:0)

请注意,默认情况下,PreferenceFragmentCompat将值保存在名为SharedPreferences的对象中,该对象可在应用程序中的任何位置访问。此处的详细信息:https://developer.android.com/guide/topics/ui/settings

因此,您可以在应用程序中的任何位置执行此操作:

SharedPreferences sharedPreferences =
    PreferenceManager.getDefaultSharedPreferences(this);
boolean isChecked = sharedPreferences.getBoolean(“pref_light”, "");

答案 1 :(得分:0)

您无法从一个片段访问应用程序中的所有视图。但是,您可以在活动中覆盖onResume()方法。在其中,您可以检查首选项并设置所需的背景。

@Override  
protected void onResume() {  
    super.onResume();  
    SharedPreferences pref = getSharedPreferences("MyPref", Context.MODE_PRIVATE);
    Boolean backgroundFlag = pref.getBoolean("pref_light", true);
    View rootView = findViewById(R.id.your_view_id);
    if (backgroundFlag) {
        rootView.setBackground(someColor);
    } else {
        rootView.setBackground(someOtherColor);
    }
}  

答案 2 :(得分:0)

从类似的片段中保存您的偏好,

 SharedPreferences prefs = getSharedPreferences("Pref", Context.MODE_PRIVATE);
 prefs.edit().putBoolean("pref_light",true).apply();

下一个代码用于对所有活动应用背景色的更改。 您可以创建一个BaseActivity,并且可以为BaseActivity创建onResume来更改所有活动的背景。

public class BaseActivity extends AppCompatActivity {
 @Override
    protected void onResume() {
        super.onResume();
        SharedPreferences pref = getSharedPreferences("Pref", Context.MODE_PRIVATE);
        Boolean isChecked = pref.getBoolean("pref_light", true);
        View rootView = getWindow().getDecorView().getRootView();

        if (isChecked) {
             rootView.setBackground(bgColor);
        } else {
             rootView.setBackground(bgOtherColor);
        }

    }

}

然后不要这样做

public class MainActivity extends AppCompatActivity {
}

喜欢

public class MainActivity extends BaseActivity {
}

对于所有活动