2012-12-02 15 views
9

Mam PreferenceActivity z kilkoma fragmentami:Jak wywołać określony PreferenceFragment z PreferenceActivity?

R.xml.preferences: (skróconą dla lepszej czytelności):

<?xml version="1.0" encoding="utf-8"?> 
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android"> 
    <header android:fragment="fragments.Fragment1" android:id="@+id/fragment1" [...] /> 
    <header android:fragment="fragments.Fragment2" android:id="@+id/fragment2" [...] /> 
    [...] 
</preference-headers> 

SettingsActivity:

public class SettingsActivity extends PreferenceActivity { 
    @Override 
    public void onBuildHeaders(List<Header> target) { 
     loadHeadersFromResource(R.xml.preferences, target); 
    } 
} 

Pokaże wpis listy z fragments.Fragment1, fragments.Fragment2, ... jeśli zostanie rozpoczęte SettingsActivity.

Ale teraz chcę przekazać Bundle tak, że specyficzne PreferenceFragment jest otwierany podczas uruchamiania działalności:

więc dodałem to do SettingsActivity:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if (savedInstanceState != null && savedInstanceState.getBoolean("shortcut")) { 
     // directly jump to fragments.Fragment1 
    } 
} 

Próbowałem załadować fragment przez getFragmentManager().findFragmentById(R.id.fragment1), ale to zwraca null. Ale nawet gdybym miał prawidłową instancję, nie wiedziałbym, jak ją przywołać. Ponadto wywołanie loadHeadersFromResource(R.xml.preferences_fragment1, target); nie działa - spowoduje to zgłoszenie wyjątku RuntimeException "Dokument XML musi rozpoczynać się od znacznika; foundPreferenceScreen w pliku binarnego XML". Nie mam żadnych pomysłów, a także wyszukiwanie w SO i Google nie zwróciło żadnych istotnych wyników.

Moje pytanie brzmi: czy możliwe jest bezpośrednie załadowanie PreferenceFragment (np. Fragments.Fragment1) z metody onCreate Activitiy? Jeśli tak to jak?

Odpowiedz

30

Według: http://developer.android.com/reference/android/preference/PreferenceActivity.html#EXTRA_SHOW_FRAGMENT

public static końcowego EXTRA_SHOW_FRAGMENT String

Dodane w poziomie API 11 Po uruchomieniu tej działalności, powołując Intent może zawierać ten dodatkowy ciąg, aby określić, który fragment powinien być początkowo wyświetlane.

Stała wartość: ": 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

Dokładnie to, czego szukałem dla. Dzięki! –

+0

Naprawdę fajnie, że to wspierali. Dziękuję za udostępnienie. To też zadziałało dobrze dla mnie. – lepert

0

Wystarczy skorzystać z poniższego kodu w PreferenceActivity i PreferenceFragment w onCreate

addPreferencesFromResource(R.xml.**YOUR PREFERENCE FRAGMENT XML**); 
Powiązane problemy