How do I call a specific PreferenceFragment from a PreferenceActivity?

后端 未结 3 1981
忘掉有多难
忘掉有多难 2020-12-16 15:37

I have a PreferenceActivity with several fragments:

R.xml.preferences: (shortened for better readability):



        
3条回答
  •  暗喜
    暗喜 (楼主)
    2020-12-16 16:25

    Or use PreferenceActivity.switchToHeader. When starting the PreferenceActivity, the header/overview of all settings pages is loaded first and then the fragment. When finishing the fragment, you will return to the overview.

    MyPreferenceActivity:

    @Override
    public void onBuildHeaders(List
    headers) { loadHeadersFromResource(R.xml.preference_headers, headers); int headerId = getIntent() != null ? getIntent().getIntExtra("header", 0) : 0; if (headerId > 0) { getIntent().removeExtra("header"); switchToHeader(findHeaderById(headerId)); } } private Header findHeaderById(long id) { if (headers != null) for (Header header : headers) if (header.id == id) return header; return null; }

    This shows how to call the PreferenceActivity together with the fragment in your MainActivity:

    Intent intent = new Intent(context, MyPreferenceActivity.class);
    intent.putExtra("header", R.id.header1);
    intent.putExtra("key", "pref1");
    startActivity(intent);
    

    If necessary, you can open the respective preference right away in PreferenceFragment1:

    @Override
    public void onCreate(Bundle savedInstanceState) {
    
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences_1);  
    
        String key = getActivity().getIntent() != null ? getActivity().getIntent().getStringExtra("key") : null;
    
        if (key != null) {
             getActivity().getIntent().removeExtra(key);
             openPreference(key);
        }
    }
    
    private void openPreference(String key) {
    
        PreferenceScreen preferenceScreen = getPreferenceScreen();
        ListAdapter listAdapter = preferenceScreen.getRootAdapter();
    
        for (int position = 0; position < listAdapter.getCount(); position++) {
    
            Preference preference = (Preference) listAdapter.getItem(position);
    
            if (preference.equals(findPreference(key))) {
                preferenceScreen.onItemClick(null, null, position, 0);
                break;
            }
        }
    }
    

    preference_headers.xml:

    
    
    
    
        

    preferences_1.xml:

    
    
    
        
    
    
    

提交回复
热议问题