How do I call a specific PreferenceFragment from a PreferenceActivity?

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

I have a PreferenceActivity with several fragments:

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



        
相关标签:
3条回答
  • 2020-12-16 16:07

    Just use below code in your PreferenceActivity and PreferenceFragment in onCreate

    addPreferencesFromResource(R.xml.**YOUR PREFERENCE FRAGMENT XML**);
    
    0 讨论(0)
  • 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<Header> 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:

    <?xml version="1.0" encoding="utf-8"?>
    
    <preference-headers
        xmlns:android="http://schemas.android.com/apk/res/android">
    
        <header android:id="@+id/headers1"
            android:fragment="de.almisoft.PreferenceFragment1"
            android:title="Title1"
            android:summary="Summary1">
        </header>
    
        <header android:id="@+id/headers2"
            android:fragment="de.almisoft.PreferenceFragment2"
            android:title="Title2"
            android:summary="Summary2">
        </header>
    
    </preference-headers>
    

    preferences_1.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <PreferenceScreen 
        xmlns:android="http://schemas.android.com/apk/res/android">
    
        <Preference
            android:key="pref1"
            android:title="title"/>
    
    </PreferenceScreen>
    
    0 讨论(0)
  • 2020-12-16 16:27

    According to: http://developer.android.com/reference/android/preference/PreferenceActivity.html#EXTRA_SHOW_FRAGMENT

    public static final String EXTRA_SHOW_FRAGMENT

    Added in API level 11 When starting this activity, the invoking Intent can contain this extra string to specify which fragment should be initially displayed.

    Constant Value: ":android:show_fragment"

    intent = new Intent( this, SettingsActivity.class );
    intent.putExtra( PreferenceActivity.EXTRA_SHOW_FRAGMENT, Fragment1.class.getName() );
    intent.putExtra( PreferenceActivity.EXTRA_NO_HEADERS, true );
    
    0 讨论(0)
提交回复
热议问题