【问题标题】:How to change the background of all activities with preferenceChange?如何更改所有活动的背景与偏好更改?
【发布时间】:2019-11-17 03:46:45
【问题描述】:

我的 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 !
                }
            }
        };

    }

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

【问题讨论】:

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


    【解决方案1】:

    从片段中保存您的偏好,

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

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

    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 {
    }
    

    所有活动

    【讨论】:

      【解决方案2】:

      您无法从一个片段访问应用中的所有视图。但是,您可以在活动中覆盖 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);
          }
      }  
      

      【讨论】:

      • 我尝试过这种方式,但如果我写,它只会将值设置为 true:java Boolean backgroundFlag = pref.getBoolean("pref_light", true); ,如果我写 java Boolean backgroundFlag = pref.getBoolean("pref_light", false); ,它会设置为 false
      • 您必须首先在 Fragment 中将布尔值保存到首选项。 developer.android.com/training/data-storage/…
      【解决方案3】:

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

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

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

      【讨论】:

      • 如果我返回并重新加载活动,这可以正常工作。但是我如何在选中或取消选中复选框后立即更改背景
      • 检查每个活动的onStart 并查看“pref_light”值。基本上,如果更改值以避免不必要的重绘,您会感兴趣。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-23
      • 2013-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-26
      • 1970-01-01
      相关资源
      最近更新 更多