Como yo estaba siguiendo a un viejo tutorial (Créez des aplicaciones pour Android -> openclassroom) me he quedado prendado de esta obsoleto método addPreferencesFromResource(int id) de la PreferenceActivity clase.

Así que mi pregunta es :

¿Cuál es la nueva forma de crear Preferencias en Android ?

  • Sería probablemente mejor tener este post en el Q&a-style. Esto significa poner la cuestión de la pregunta, y pon la respuesta a ella como la respuesta en lugar de poner todo en la cuestión. Véase también auto-respuesta
  • Así que me encantaría hacerlo, pero no tengo la reputación de la misma; me la hago cada vez que puedo 🙂
  • Esto podría ser un recurso útil, pero no es una pregunta que puede ser contestada. Es posible que desee echar abajo hasta que pueda auto-respuesta. Una vez que usted puede auto-respuesta, usted puede poner la copia de seguridad.
  • OK, pero ¿cómo se puede conseguir reputación, entonces? Respondiendo a las preguntas? Comentando? Lo siento por todas las preguntas pero es mi primer post como te habrás dado cuenta 🙂
  • hacer preguntas y dar respuestas útiles. Ver: stackoverflow.com/help/whats-reputation. Creo que una vez que usted tiene una reputación de 15 puntos, usted puede auto-respuesta.
  • gracias por la respuesta de los malos hacen esto, entonces !
  • Amigo, sería la manera más fresco si usted hizo una pregunta real, seguido por una respuesta. Esta corriente «pregunta» no dice mucho, y no va a ser muy bueno para google. Pls tratar de hacer que se vea más como las otras preguntas en este sitio.

InformationsquelleAutor WannaGetHigh | 2014-05-07

2 Comentarios

  1. 99

    He encontrado este post (Qué usar en lugar de «addPreferencesFromResource» en un PreferenceActivity?) que me ayude a entender que usted tiene que ir a través de un PreferenceFragment para hacerlo.

    En la siguiente explicación que yo uso your.package. sólo para mostrar que usted tiene que poner el nombre del paquete. Todo el mundo tiene su propio paquete, así que por favor reemplazarlo con el paquete.

    empecemos :


    1. Preferencia Fragmento

    • Crear su PreferenceFragment clase

      MyPreferenceFragment

      public class MyPreferenceFragment extends PreferenceFragment
      {
          @Override
          public void onCreate(Bundle savedInstanceState)
          {
              super.onCreate(savedInstanceState);
              addPreferencesFromResource(R.xml.fragment_preference);
          }
      }

    • A continuación, el xml asociado a los recursos

      fragment_preference.xml (en la carpeta res/xml del 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 por el Fragment parte.


    2. La Preferencia De Actividad

    • Crear el PreferenceActivity clase

      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 te olvides para reemplazar isValidFragment(String fragmentName) método con el que usted conseguirá un puñetazo en la cara por su aplicación ! 😉 Más en serio que no tengo idea de por qué usted necesita hacer esto pero es necesario. Si alguien tiene una explicación acerca de esto yo me daría con mucho gusto leerlo 🙂

      EDICIÓN :


      Gracias a kirtan403 ahora sé por qué es necesaria : se ha establecido debido a un (android marco fragmento de la inyección).


      Como se puede ver en la onBuildHeaders(List<Header> target) cargar otro archivo xml que contienen la encabezados de la preferencia. En resumen, los encabezados de la parte izquierda de la preferencia y el fragmento son la parte de la derecha (por comprimido). Para un teléfono que va a tener primero los encabezados y cuando usted hace clic en un elemento y el fragmento correspondiente se coloca en la parte superior de la lista de cabeceras.

      Leer este artículo (Multi-panel de desarrollo en Android con Fragmentos – Tutorial) las imágenes de explicar a sí mismos.

    • A continuación, el xml asociado a los recursos

      headers_preference.xml (en la carpeta res/xml del 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 el encabezado sección :

      android:fragment="your.package.MyPreferenceFragment"

      Esto actuará como un Enlace para el fragmento que desea mostrar. En la Tablet se carga en la parte derecha y en el teléfono se carga en la parte superior de la vista actual.


    3. Manifiesto De Android

    Ahora lo que debe hacer es agregar su Actividad a la AndroidManifest.xml archivo.

    Dentro de la application la sección añadir estas líneas :

    <activity
        android:name="your.package.MyPreferenceActivity"
        android:label="Preferences">
    </activity>

    Usted probablemente le dirá de mí :

    «Oh darling olvidó poner android:launchMode=»singleTask» en su actividad»

    Pero NO PONER ESTE como usted nunca va a cargar el fragmento en el teléfono. Este error fue solucionado por un gran hombre ! Este es el enlace a su blog (Android encabezado de preferencias en la pequeña pantalla del teléfono/).


    4. Inicio de las Preferencias desde el Menú

    Finalmente usted necesita para agregar la capacidad de mostrar esta Preferencia !! Para ello se necesitan 3 cosas :

    • El Menú

      menu.xml (en la carpeta res/menu de tu 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>

    • Cargar este Menú en su actividad Principal (no el PreferenceActivity) bajo el método de onCreateOptionsMenu(Menu menu)

      @Override
      public boolean onCreateOptionsMenu(Menu menu)
      {
          MenuInflater inflater = getMenuInflater();
          inflater.inflate(R.menu.menu, menu);
          return true;
      }

    • Partir de la MyPreferenceActivity Actividad cuando haga clic en ese botón.

      Para que usted tendrá que reemplazar la onOptionsItemSelected(MenuItem item) método 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 !

    Yo no he probado este código. Yo la tomé y modificado a partir de mi propio código así que no puede haber bien copiado y pegado las cosas. Si encuentras errores me dicen, voy a tratar de averiguar el problema y solucionarlo.

    Espero que este post va a ayudar a algunas personas por ahí 😀

    Saludos !

    • fwiw he añadido los enlaces en (pls incluir un nombre de enlace, en caso de que el enlace va muertos en el futuro lo hace posible a google de la página) & añadido algún formato para hacer más fácil la lectura. También hizo algunos cambios de menor importancia se basa en las mejores prácticas en este sitio. Siéntase libre de cambiar alguna de mis ediciones – es SU pregunta, después de todo. Oh, y usted puede seguir adelante y eliminar sus comentarios anteriores, cos que ahora están fuera de fecha. G’luck
    • Muchas gracias por tu ayuda ! De hecho, es más fácil de leer y también gracias por los consejos voy a recordar es que para mi próxima respuestas/preguntas en este sitio ! Seguir montando la onda 🙂
    • la roca, amigo 🙂
    • Usted ha mencionado acerca de la isValidFragment() uso, ¿por qué se utiliza. usted puede leer más acerca de esto aquí . A causa de la Vulnerabilidad, este método fue introducido en Android 4.4 Kitkat.
    • Muchas gracias por el enlace, ahora entiendo por qué hicieron esto 🙂
    • Hola, esto fue de gran utilidad! cualquier posibilidad de un consejo rápido sobre cómo mostrar sólo el fragmento, sin ningún tipo de pantalla adicional en el medio?
    • Usted necesita para reemplazar isValidFragment para evitar que el Fragmento de la Vulnerabilidad de Inyección. securityintelligence.com/…
    • ty por el enlace, yo ya vi el exploit en kirtan403 comentario 🙂

  2. 19

    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 ejecutar rápidamente. Tiene sólo uno .archivo java y dos pequeños archivos xml.

    Actividad de configuración de RECORDATORIOS

    Después de la adición de los 3 archivos a su proyecto, no te olvides de

    A) Agregar las Preferencias de la Actividad para el archivo de Manifiesto

    B) Agregue un poco de camino para el lanzamiento de las Preferencias de la Actividad .. por ejemplo, un Botón o elemento de Menú

    Añadir los siguientes archivos a su proyecto. Utilizar el orden en que aparecen en para evitar errores de compilación.

    1. Agregar /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>
    2. Agregar /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>
    3. Agregar el código de la 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);
          }
      }
    • solución agradable!! thx 🙂
    • Quiero mostrar una Pantalla de configuración como un fragmento (no como una actividad)… es posible hacerlo en un fragmento.

Dejar respuesta

Please enter your comment!
Please enter your name here