How to move back from Preferences subscreen to main screen in PreferenceFragmentCompat?

前端 未结 2 767
礼貌的吻别
礼貌的吻别 2020-12-30 08:15

I am trying to implement a Settings screen using PreferenceFragmentCompat. My preference xml has a preference subscreen like this:

preferences.xml

2条回答
  •  遥遥无期
    2020-12-30 08:29

    By using setPreferenceScreen you are setting the root preference screen to the sub preference screen which is preventing you from having a hierarchy of preference screens to navigate back through.

    I suggest that you treat each PreferenceScreen as a Fragment and add a new Fragment when you navigate into a sub screen.

    @Override
    public boolean onPreferenceStartScreen(PreferenceFragmentCompat preferenceFragmentCompat,
                                           PreferenceScreen preferenceScreen) {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        MyPreferenceFragment fragment = new MyPreferenceFragment();
        Bundle args = new Bundle();
        args.putString(PreferenceFragmentCompat.ARG_PREFERENCE_ROOT, preferenceScreen.getKey());
        fragment.setArguments(args);
        ft.add(R.id.fragment_container, fragment, preferenceScreen.getKey());
        ft.addToBackStack(preferenceScreen.getKey());
        ft.commit();
        return true;
    }
    

    MyPreferenceFragment

    public class MyPreferenceFragment extends AppPreferenceFragment {
    
       public static final String FRAGMENT_TAG = "my_preference_fragment";
    
       public MyPreferenceFragment() {
       }
    
       @Override
       public void onCreatePreferences(Bundle bundle, String rootKey) {
           setPreferencesFromResource(R.xml.preferences, rootKey);
       }
    }
    

    AppPreferenceFragment

    public abstract class AppPreferenceFragment extends PreferenceFragmentCompat {
    
    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
    
        // Set the default white background in the view so as to avoid transparency
          view.setBackgroundColor(
                  ContextCompat.getColor(getContext(), R.color.background_material_light));
    
      }
    }
    

    That way when you press the back button each Fragment will be popped from the stack.

    For more information see this GitHub project

提交回复
热议问题