Rozwijam aplikację z minSdkVersion = "11", czyli aplikacją na tablety i Androida 4.0 oraz nowszymi. Przeglądałem internet na ten temat, ale nie znalazłem zbyt wiele.android - Jak ustawić niestandardowy układ PreferenceActivity w systemie Android 3.0?
Aby zaimplementować niestandardowy układ dla poprzednich wersji Androida SDK, musimy po prostu stworzyć layout (powiedzmy preference.xml) z ListView, a jego id jest równy Android.R.id.list i użyć metody setContentView.
preference.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ListView android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</RelativeLayout>
W Androidzie 3.0 wiele się zmieniło i preferencje są realizowane z wykorzystaniem fragmentów. To jest jak mój plik preference_headers.xml wygląda następująco:
<preference-headers
xmlns:android="http://schemas.android.com/apk/res/android">
<header android:fragment="com.example.MyPreferenceActivity$GeneralSettingsFragment"
android:title="General"
android:summary="Common settings." />
<header
android:title="Example.com" >
<intent android:action="android.intent.action.VIEW"
android:data="http://www.example.com" />
</header>
</preference-headers>
MyPreferenceActivity.java:
public class MyPreferenceActivity extends PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.preference);
// Add a button to the header list.
if (hasHeaders()) {
Button button = new Button(this);
button.setText("Log out");
setListFooter(button);
}
}
/**
* Populate the activity with the top-level headers.
*/
@Override
public void onBuildHeaders(List<Header> target) {
loadHeadersFromResource(R.xml.preference_headers, target);
}
public static class GeneralSettingsFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.fragmented_preferences);
}
}
}
Teraz jeśli biegnę MyPreferenceActivity ujrzę tego błędu w LogCat:
> java.lang.IllegalArgumentException: No view found for id 0x10202be for
> fragment GeneralSettingsFragment{4077f8c0 #0 id=0x10202be}
> E/AndroidRuntime(17103): at
> android.app.FragmentManagerImpl.moveToState(FragmentManager.java:729)
> E/AndroidRuntime(17103): at
> android.app.FragmentManagerImpl.moveToState(FragmentManager.java:926)
> E/AndroidRuntime(17103): at
> android.app.FragmentManagerImpl.moveToState(FragmentManager.java:909)
> E/AndroidRuntime(17103): at
> android.app.FragmentManagerImpl.dispatchStart(FragmentManager.java:1584)
> E/AndroidRuntime(17103): at
> android.app.Activity.performStart(Activity.java:4377)
> E/AndroidRuntime(17103): at
> android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1724)
> E/AndroidRuntime(17103): ... 11 more
I wiesz, co powoduje ten problem. FragmentManager po prostu nie może znaleźć widoku do wstawienia fragmentu GeneralSettingsFragment w. Ale nie wiem jak go rozwiązać.
Nawiasem mówiąc, jeśli uruchomię tę samą aplikację na Androida 4.0, to widzę pierwszą aktywność preferencji z nagłówkami. Ale jeśli kliknę przycisk Ogólne, aplikacja zawiesi się, a otrzymam podobny komunikat o błędzie:
java.lang.IllegalArgumentException: No view found for id 0x10202cd for fragment GeneralSettingsFragment{4134b4e0 #0 id=0x10202cd}
E/AndroidRuntime(2170): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:789)
E/AndroidRuntime(2170): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:998)
E/AndroidRuntime(2170): at android.app.BackStackRecord.run(BackStackRecord.java:622)
E/AndroidRuntime(2170): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1330)
E/AndroidRuntime(2170): at android.app.Activity.performStart(Activity.java:4474)
E/AndroidRuntime(2170): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1928)
Co próbujesz zrobić? Dlaczego potrzebujesz niestandardowego układu? – alexanderblom
Chcę mieć dokładniejszą kontrolę nad działaniem preferencji. Poza tym chcę, aby był on kompatybilny z nowszymi wersjami Androida SDK w jak największym stopniu, tj. Muszę rozszerzyć PreferenceActivity, ale nie wdrażać go samodzielnie od zera. – morphium