¿Cómo se crean Fragmentos de preferencias y preferencias en Android?
Como estaba siguiendo un antiguo tutorial ( Createz des applications para Android -> openclassroom ) me quedé atascado en este método obsoleto addPreferencesFromResource(int id)
de la clase PreferenceActivity.
Así que mi pregunta es:
- EditText - Intervalo entre el texto y la línea de EditText
- XML predeterminado para la notificación de estado
- Relacionar URI con <data> como http://example.com/algo en AndroidManifest
- Cambio de color de una barra de progreso mediante programación
- Los márgenes de ConstraintLayout no funcionan
¿Cuál es la nueva forma de crear Preferencias en Android?
- Soporte para diferentes resoluciones android
- Cómo dibujar un rectángulo con esquinas redondeadas con XML?
- Diseñar un diseño como debajo de la imagen con botones de imagen en android
- Forma rectangular con dos colores sólidos
- Barra de herramientas en AppBarLayout es desplazable aunque RecyclerView no tiene suficiente contenido para desplazarse
- Resize drawable en el elemento de lista de capas
- Espacio adicional utilizando el diseño del coordinador mientras se desplaza
- Cómo actualizar match_parent en un linearLayout después de usar setRotation?
He encontrado este post ( ¿Qué se debe utilizar en lugar de "addPreferencesFromResource" en una PreferenceActivity? ) Que me ayudan a entender que usted tiene que pasar por un PreferenceFragment
para hacerlo.
En la siguiente explicación utilizo your.package.
Sólo para mostrar que tienes que poner el nombre del paquete. Todo el mundo tiene su propio paquete por lo que debe sustituirlo por su paquete.
vamos a empezar :
1. Fragmento de preferencia
-
Cree su clase PreferenceFragment
MyPreferenceFragment
public class MyPreferenceFragment extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.fragment_preference); } }
-
Entonces el recurso xml asociado
Fragment_preference.xml (en la carpeta res / xml de su proyecto)
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:title="FOO"> <CheckBoxPreference android:key="checkBoxPref" android:title="check it out" android:summary="click this little box"/> </PreferenceCategory> </PreferenceScreen>
Eso es todo para la parte del
Fragment
.
2. Actividad de preferencia
-
Cree la clase PreferenceActivity
MyPreferenceActivity
public class MyPreferenceActivity extends PreferenceActivity { @Override public void onBuildHeaders(List<Header> target) { loadHeadersFromResource(R.xml.headers_preference, target); } @Override protected boolean isValidFragment(String fragmentName) { return MyPreferenceFragment.class.getName().equals(fragmentName); } }
No olvide anular el
isValidFragment(String fragmentName)
ya que recibirá un golpe en la cara por su aplicación! 😉 Más en serio que no tengo idea de por qué necesita hacer esto, pero es necesario. Si alguien tiene una explicación sobre esto, lo leería con gusto 🙂EDIT:
Gracias a kirtan403 Ahora sé por qué es necesario: tiene que ser fijado debido a una ( inyección de fragmento de marco Android ).
Como se puede ver en el
onBuildHeaders(List<Header> target)
,onBuildHeaders(List<Header> target)
otro archivo xml que contiene los encabezados de la preferencia. En resumen, los encabezados son la parte izquierda de la preferencia y el fragmento es la parte derecha (para la tableta). Para un teléfono, primero tendrá los encabezados y al hacer clic en un elemento, el fragmento correspondiente se colocará encima de la lista de encabezados.Lea este artículo ( Desarrollo de múltiples paneles en Android con Fragmentos – Tutorial ) las imágenes se explican a sí mismas.
-
Entonces el recurso xml asociado
Headers_preference.xml (en la carpeta res / xml de su proyecto)
<?xml version="1.0" encoding="utf-8"?> <preference-headers xmlns:android="http://schemas.android.com/apk/res/android"> <header android:fragment="your.package.MyPreferenceFragment" android:title="Goto: Preference fragment" android:summary="An example of some preferences." /> </preference-headers>
Como usted puede haber notado en la sección de encabezado usted tiene:
android:fragment="your.package.MyPreferenceFragment"
Esto actuará como un enlace al fragmento que desea mostrar. En Tablet se cargará en la parte derecha y en el teléfono se cargará en la parte superior de la vista actual.
3. Manifiesto de Android
Ahora lo que debe hacer es agregar su actividad al archivo AndroidManifest.xml
.
Dentro de la sección de la application
, añada estas líneas:
<activity android:name="your.package.MyPreferenceActivity" android:label="Preferences"> </activity>
Usted probablemente me dirá:
"Oh querido te olvidaste de poner android: launchMode =" singleTask " en tu actvity"
Pero NO PONGA ESTE como usted nunca cargará su fragmento en el teléfono. ¡Este error fue resuelto por un gran hombre! Este es el enlace a su blog ( preferencias de encabezado de Android en pantalla pequeña / teléfono ).
4. Inicie el menú Preferencias del menú
¡Finalmente necesitas agregar la habilidad de mostrar esta Preferencia !! Para ello necesitará 3 cosas:
-
El menú
Menu.xml (en la carpeta res / menu de su proyecto)
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/preferences" android:title="Preferences" /> </menu>
-
Cargando este Menú en su actividad Principal (no en la PreferenciaActividad) bajo el método
onCreateOptionsMenu(Menu menu)
@Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu, menu); return true; }
-
Iniciando la Actividad
MyPreferenceActivity
al hacer clic en ese botón.Para eso necesitará anular el
onOptionsItemSelected(MenuItem item)
en su actividad principal.@Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()) { case R.id.preferences: { Intent intent = new Intent(); intent.setClassName(this, "your.package.MyPreferenceActivity"); startActivity(intent); return true; } } return super.onOptionsItemSelected(item); }
Et voila les amis!
No he probado este código. Lo tomé y lo modificé de mi propio código para que no tenga bien copiado las cosas pegadas. Si te encuentras con errores, dímelo, trataré de resolver el problema y arreglar esto.
Espero que este post ayudará a algunas personas por ahí: D
Saludos!
Me gustó la solución de este post: http://alvinalexander.com/android/android-tutorial-preferencescreen-preferenceactivity-preferencefragment
.. porque parece el más compacto para alguien que sólo necesita algo muy básico y funcionando rápidamente. Tiene sólo un archivo .java y dos pequeños archivos xml.
Actividad RECORDATORIOS
Después de agregar los 3 archivos a su proyecto, no olvide
A) Agregue el archivo Prefs Activity to Manifest
B) Añade alguna forma de iniciar la Actividad de Prefs, por ejemplo, un botón o un elemento de menú
Agregue los siguientes archivos a su proyecto. Utilice el orden en el que se enumeran para evitar errores de compilación.
-
Añadir /res/values/array.xml
<resources> <string-array name="listArray"> <item>Ace</item> <item>Club</item> </string-array> <string-array name="listValues"> <item>Ace</item> <item>Club</item> </string-array> </resources>
-
Añadir /res/xml/preferences.xml
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <EditTextPreference android:title="Your Name" android:key="username" android:summary="Please provide your username"></EditTextPreference> <CheckBoxPreference android:title="Application Updates" android:defaultValue="false" android:summary="This option if selected will allow the application to check for latest versions." android:key="applicationUpdates" /> <ListPreference android:title="Download Details" android:summary="Select the kind of data that you would like to download" android:key="downloadType" android:defaultValue="Ace" android:entries="@array/listArray" android:entryValues="@array/listValues" /> </PreferenceScreen>
-
Añadir el código de actividad
public class AppPreferenceActivity extends PreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getFragmentManager().beginTransaction().replace(android.R.id.content, new MyPreferenceFragment()).commit(); checkValues(); } public static class MyPreferenceFragment extends PreferenceFragment { @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); } } private void checkValues() { SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); String strUserName = sharedPrefs.getString("username", "NA"); boolean bAppUpdates = sharedPrefs.getBoolean("applicationUpdates",false); String downloadType = sharedPrefs.getString("downloadType","1"); String msg = "Cur Values: "; msg += "\n userName = " + strUserName; msg += "\n bAppUpdates = " + bAppUpdates; msg += "\n downloadType = " + downloadType; Toaster.shortDebug(msg); } }
- ¿Cómo puedo eliminar el divisor de un listview en android?
- Error: no se pudo inicializar la clase com.android.ide.common.util.ReadWriteProcessLock después de actualizar a AS 2.4