Fragment item won't collapse

戏子无情 提交于 2020-01-02 07:39:01

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!