findpreference - android-¿Cómo configurar un diseño personalizado para PreferenceActivity en Android 3.0?
preferencescreen android studio (3)
Probé este código para mi aplicación
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="@string/PreferencesActivity.GeneralSettingsCategoryTitle">
<Preference
android:title="yor title"
android:summary="your summary"
android:key="key to access preference" />
<Preference
android:title="@string/"
android:summary="@string/"
android:key="key2" />
<PreferenceScreen
android:key="key3"
android:title="@string/"
android:summary="@string/">
<CheckBoxPreference
android:title="@string/"
android:defaultValue="false"
android:summary="@string/"
android:key="key4" />
<CheckBoxPreference
android:title="@string/"
android:defaultValue="true"
android:summary="@string/"
android:key="key5" />
<ListPreference
android:title="@string/"
android:summary="@string/"
android:key="key6"
android:defaultValue="buttons"
android:entries="@array/"
android:entryValues="@array/" />
....
</prefefenceScreen>
</preferenceCategory>
</preferenceScreen>
enter code here
Estoy desarrollando una aplicación con minSdkVersion = "11", es decir, una aplicación para tabletas y Android 4.0 y más reciente. He examinado internet sobre este tema, pero no he encontrado mucho.
Para implementar un diseño personalizado para versiones anteriores de Android SDK, solo tenemos que crear un diseño (por ejemplo, preferencia.xml) con ListView y su id es igual a android.R.id.list y usar el método setContentView.
preferences.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>
En Android 3.0 las cosas han cambiado y las preferencias se implementan con el uso de fragmentos. Así es como se ve mi archivo preferences_headers.xml:
<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);
}
}
}
Ahora, si ejecuto MyPreferenceActivity, veré este error en 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
Sé lo que causa este problema. FragmentManager simplemente no puede encontrar una vista para insertar el fragmento GeneralSettingsFragment. Pero no sé cómo resolverlo.
Por cierto, si ejecuto la misma aplicación en Android 4.0, puedo ver la primera actividad de preferencia con encabezados. Pero si hago clic en General, la aplicación se bloqueará y recibiré un error similar en LogCat:
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)
Tuve el mismo problema que tú.
Probé muchas cosas pero aquí está mi código completo:
https://github.com/iRail/BeTrains-for-Android/blob/master/src/tof/cv/mpp/MyPreferenceActivity.java
El truco es agregar setContentView en la sección onBuildHeaders, pero NO en onCreate.
También hice algunas pruebas en fragmentos y no estoy completamente seguro de por qué esto funciona, pero te prometo: ¡Tengo un diseño personalizado en la sección del encabezado de la tableta!
no es necesario que establezcaContenView. en este caso de ejemplo, la población de diseño se realiza mediante encabezados y fragmentos asociados, otras palabras automáticamente.