片段项不会崩溃

我试图在片段中切换我的1个形状的可见性但是每当我单击SwitchPreferenceCompat控件并返回到我加载的片段时它都不起作用。 在我运行应用程序之前和期间都没有出现任何错误或警告。 这是我的代码:

fragment_blueshapes.xml

      

SettingsActivity.java

 public class SettingsActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); PreferencesFragment newFragment = new PreferencesFragment(); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.master_container, newFragment); transaction.commit(); } } 

PreferencesFragment.java

 public class PreferencesFragment extends PreferenceFragmentCompat { /** * {@inheritDoc} */ @Override public void onCreatePreferences(Bundle bundle, String s) { addPreferencesFromResource(R.xml.app_preferences); } } 

XML / app_preferences.xml

     

preference_keys.xml

   pref_pref1  

strings.xml中

  Shapes Show squares This preference applies to all square shapes  

设置页面截图 在此处输入图像描述

BlueShapesActivity.java

 public class BlueShapesActivity extends AppCompatActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.fragment_shapes); if (savedInstanceState == null) { FragmentBlueShapes newFragment = new FragmentBlueShapes(); FragmentTransaction transaction = this.getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.detail_container, newFragment); transaction.commit(); } } } 

FragmentBlueShapes.java

 public class FragmentBlueShapes extends android.support.v4.app.Fragment { public FragmentBlueShapes() { } boolean squareState; @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_blueshapes, container, false); } @Override public void onResume(){ super.onResume(); loadPreferences(); displaySettings(getView()); } public void loadPreferences(){ SharedPreferences pref = this.getActivity().getSharedPreferences("settings", Context.MODE_PRIVATE); squareState = pref.getBoolean("square_state", true); } public void displaySettings(View rootView) { if (squareState) { rootView.findViewById(R.id.blue_square).setVisibility(View.VISIBLE); } else { rootView.findViewById(R.id.blue_square).setVisibility(View.GONE); } } } 

目前的结果 在此处输入图像描述

预期结果 在此处输入图像描述

首先建议请遵循android编码标准,因为这将解决您的很多问题和共享偏好https://medium.com/@ali.muzaffar/android-sharedpreferences-singleton-to-make-life-easier-f1d802b6cd8e尝试使用单例模式,永远不会硬编码你的常量创建一个类Constants.class并将所有常量放在那里,这将更容易维护。

编辑1:

一旦你改变了SwitchPreferenceCompat的值,就可以在应用程序的任何地方访问它,改变你的loadPreferences方法。

 private void loadPreferences(){ SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext()); squareState = sharedPreferences.getBoolean("pref_pref1", false); }