Toolbar is hidden in nested PreferenceScreen

前端 未结 4 683
一生所求
一生所求 2021-02-02 13:36

I use PreferenceFragment in ActionBarActivity from support-v7 library.
In the Activity I have Toolbar. Everything goes okay, until I o

4条回答
  •  萌比男神i
    2021-02-02 14:23

    In my solution you only need one AppCompatActivity and one PreferenceFragement, but several XML files, each having only one level of PreferenceScreens.

    XML file list

    • top level PreferenceScreen
    • second level PreferenceScreen 0
    • second level PreferenceScreen 1
    • second level PreferenceScreen 2
    • ...

    This code is for one sub-level (for simplicity and to get the idea), but you can easily extend it to have arbitrary sub-levels of PreferenceScreens.

    SettingsFragment.java

    public class SettingsFragment extends PreferenceFragment
    {
        private int xmlId;
    
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            xmlId = R.xml.preferences;
            addPreferencesFromResource(xmlId);
        }
    
        public void changePrefScreen(int xmlId, int titleId)
        {
            this.xmlId = xmlId;
            ((AppCompatActivity)getActivity()).getSupportActionBar().setTitle(getActivity().getResources().getString(titleId));
            getPreferenceScreen().removeAll();
            addPreferencesFromResource(xmlId);
        }
    
        // will be called by SettingsActivity (Host Activity)
        public void onUpButton()
        {
            if(xmlId == R.xml.preferences) // in top-level
            {
                // Switch to MainActivity
                Intent intent = new Intent(getActivity(), MainActivity.class);
                startActivity(intent);
            }
            else // in sub-level
            {
                changePrefScreen(R.xml.preferences, R.string.settings);
            }
        }
    
        @Override
        public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference)
        {
            String key = preference.getKey();
    
            //
            // Top level PreferenceScreen
            //
            if(key.equals("top_key_0"))
            {
                changePrefScreen(R.xml.download_preference_screen, R.string.download_database); // descend into second level
            }
    
            // ...
    
            //
            // Second level PreferenceScreens
            //
            if (key.equals("second_level_key_0"))
            {
               // do something...
            }
    
            // ...
         }
    

    SettingsActivity.java

    public class SettingsActivity extends AppCompatActivity
    {
        SettingsFragment settingsFragment;
    
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
    
            settingsFragment = new SettingsFragment();
    
            // Display the fragment as the main content.
            getFragmentManager().beginTransaction()
                    .replace(android.R.id.content, settingsFragment)
                    .commit();
        }
    
        //
        // Handle what happens on up button
        //
        @Override
        public boolean onOptionsItemSelected(MenuItem item) 
        {
            switch (item.getItemId()) 
            {
                case android.R.id.home:
                    settingsFragment.onUpButton();
                    return true;
            }
            return true;
        }
    
        // ...
    }
    

    Technically it should work for all Android versions for which the PreferenceFragment is available.

提交回复
热议问题