studio findpreference create android android-3.0-honeycomb preferenceactivity

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!

https://github.com/iRail/BeTrains-for-Android/blob/master/src/tof/cv/mpp/view/StockPreferenceFragment.java


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.