问题
I'm trying to toggle the visibility of 1 of my shapes within a fragment but it does not work whenever I click the SwitchPreferenceCompat control & return to my loaded fragment. No errors or warnings had appeared before & during I ran the app either. Here is my code:
fragment_blueshapes.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<View
android:id="@+id/blue_square"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_centerHorizontal="true"
android:layout_marginBottom="20dp"
android:background="@drawable/shape_blue_square" />
<View
android:id="@+id/blue_circle"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_centerHorizontal="true"
android:background="@drawable/shape_blue_circle"
android:layout_marginBottom="20dp"
android:layout_below="@id/blue_square"/>
<View
android:id="@+id/blue_rectangle"
android:layout_width="300dp"
android:layout_height="100dp"
android:layout_centerHorizontal="true"
android:background="@drawable/shape_blue_rectangle"
android:layout_below="@id/blue_circle"/>
</RelativeLayout>
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
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.preference.PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<android.support.v7.preference.SwitchPreferenceCompat
android:defaultValue="true"
android:key="pref_pref1"
android:title="@string/preferences_switch_title"
android:summary="@string/preferences_switch_summary"
android:layout="@layout/preference_multiline"/>
</android.support.v7.preference.PreferenceScreen>
preference_keys.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="pref_pref1" translatable="false">pref_pref1</string>
</resources>
strings.xml
<resources>
<string name="app_name">Shapes</string>
<string name="preferences_switch_title">Show squares</string>
<string name="preferences_switch_summary">This preference applies to all square shapes</string>
</resources>
Settings page screenshot
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);
}
}
}
Current result
Expected result
回答1:
Well first suggestion please follow android coding standard because that would solve your a lot of problem and for Sharedpreferences https://medium.com/@ali.muzaffar/android-sharedpreferences-singleton-to-make-life-easier-f1d802b6cd8e try using singleton pattern and never hardcode your constants create a class Constants.class and put all your constants there that would be lot easier to maintain.
Edit 1:
Once you change the value of SwitchPreferenceCompat you can access it anywhere in the application change your loadPreferences method like this.
private void loadPreferences(){
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext());
squareState = sharedPreferences.getBoolean("pref_pref1", false);
}
来源:https://stackoverflow.com/questions/41961805/fragment-item-wont-collapse