Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android: inicia una preferencia personalizada desde una preferenciaActividad

Quisiera poder lanzar una 2da pantalla de la preferencia de mi PreferenceActivity. Y en la segunda pantalla Preferencia me gustaría usar un diseño predefinido de xml. Por lo tanto, tengo dos preguntas:

¿Cómo uso un diseño XML como la vista de diseño de una preferencia? ¿Cómo puedo añadir esta preferencia personalizada a una PreferenceActivity tal que se inició cuando se pulsa?

Gracias

* EDIT en respuesta a la coartada

Estoy intentando lanzar una actividad de una pantalla de la preferencia, declarando la actividad para ser lanzada en xml. Esto provoca esta excepción:

04-01 19:04:37.962: ERROR/AndroidRuntime(8061): android.content.ActivityNotFoundException: Unable to find explicit activity class {com.me/CustomPrefScreen}; have you declared this activity in your AndroidManifest.xml? 

* Otra actualización. Sin embargo, si reemplazo PrefrenceScreen en settings.xml con alguna extensión de Preferencia, que reemplaza onClick () para iniciar CustomPrefScreen, entonces todo funciona bien.

Actividad de preferencias principales:

 public class MyPreferences extends PreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.settings); } } 

Settings.xml

 <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceScreen android:summary="my summary" android:title="my title"> <intent android:action="android.intent.action.MAIN" android:targetPackage="com.me" android:targetClass="CustomPrefScreen"/> </PreferenceScreen> </PreferenceScreen> 

Archivo mainfest

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.me" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name" android:theme="@style/Theme.NoBackground"> <activity android:name=".MyApp" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".CustomPrefScreen" android:label="@string/app_name"> </activity> <activity android:name=".MyPreferences" android:label="@string/app_name"> </activity> </application> <uses-sdk android:minSdkVersion="4" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> </manifest> 

  • Cómo establecer varios valores predeterminados en un MultiSelectListPreference?
  • Hacer que Preferencia parezca deshabilitada, pero sigue registrando clics
  • Mostrar el botón de arriba en la barra de acción en las preferencias de la pantalla principal
  • Cómo instanciar el diseño para las preferencias personalizadas, utilizando android: atributo de diseño
  • ¿Se pueden compartir SharedPreferences entre diferentes aplicaciones de Android?
  • Archivo de preferencias del usuario vs Archivo de preferencias de la aplicación
  • Los valores de caché de SharedPreferences tienen sentido?
  • Android exploit dalvik classes: Preferencias
  • 4 Solutions collect form web for “Android: inicia una preferencia personalizada desde una preferenciaActividad”

    Una solución sería extender un DialogPreference que permite la configuración de un diseño personalizado para el diálogo de preferencias. De esta manera, tienes una preferencia en la lista y cuando la tocas, obtienes un diálogo con tu UI de configuración personalizada.

      <com.xyz.MyPreference android:dialogLayout="@layout/yourlayout" android:dialogTitle="Dialog Title" android:dialogMessage="Dialog summary" android:key="preference_key" android:title="Preference Title" android:summary="Preference summary" android:defaultValue="Default Value" /> 

    Y la clase

     class MyPreference extends DialogPreference { // along with constructors, you will want to override @Override protected void onBindDialogView(View view) { super.onBindDialogView(view); // view is your layout expanded and added to the dialog // find and hang on to your views here, add click listeners etc // basically things you would do in onCreate mTextView = (TextView)view.findViewById(R.Id.mytextview); } @Override protected void onDialogClosed(boolean positiveResult) { super.onDialogClosed(positiveResult); if (positiveResult) { // deal with persisting your values here } } } 

    Obviamente hay algunos otros detalles, pero esta es la idea básica.

    La solución de alibi – de definir una intención dentro de una entrada <PreferenceScreen> – funcionó para mí, después de mucho ensayo y error de los campos targetPackage y targetClass .

    targetPackage debe ser la ruta completa al nombre del paquete de mi aplicación (es decir, el package= entrada en el archivo AndroidManifest.xml). targetClass debe ser la ruta completa de la Actividad – INCLUYENDO el nombre del paquete, incluso si la Actividad está en el mismo paquete que la Aplicación.

    El archivo AndroidManifest.xml de la aplicación también (por supuesto) necesita una entrada para la actividad. No definí un <intent-filter> para esta entrada, presumiblemente porque la action es MAIN (esto era cierto si la actividad estaba en el mismo o un paquete diferente que la aplicación).

    Ejemplo: el paquete de la aplicación es com.thissocialworld . La Actividad que com.thissocialworld.SpecialPreferences iniciar desde PreferencesScreen encuentra en un paquete denominado com.coolcommon y la clase Activity es com.thissocialworld.SpecialPreferences . La entrada dentro de la <PreferenceScreen> ve así:

     <intent android:action="android.intent.action.MAIN" android:targetPackage="com.thissocialworld" android:targetClass="com.thissocialworld.SpecialPreferences"/> 

    Puedo intentar cambiar action.MAIN a action.PREFERENCES si parece ser necesario obtener acceso al PreferencesManager .

    (PS mi primer post aquí, no pude averiguar cómo publicar esto como un comentario a la discusión iniciada por coartada.)

    Es posible que desee algo similar a lo que hice para subir una foto de la galería o cámara.

     package com.atClass.lmt; import android.app.Activity; import android.app.AlertDialog; import android.content.ContentValues; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.preference.PreferenceActivity; import android.preference.Preference; import android.preference.Preference.OnPreferenceClickListener; import android.provider.MediaStore; import android.util.Log; public class Prefs extends PreferenceActivity{ //public static final int FLAG_ACTIVITY_CLEAR_TOP = 1; private static final int MEDIA_IMAGE_REQUEST_CODE = 1; private static final int CAMERA_IMAGE_REQUEST_CODE = 2; public static Uri cImageUri; public static Context cContext; public static Activity cActivity; @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.settings); this.cContext = (Context)this; this.cActivity = (Activity)this; Preference customPref = (Preference) findPreference("user_display_picture"); customPref.setOnPreferenceClickListener( new OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { return imageUploadDialog(); } }); } protected void onStop(){ super.onStop(); MapTools.createMapView(false); Lmt.serviceBinder.serviceThread("loginDevice"); } public boolean imageUploadDialog(){ final CharSequence[] items = {"Take picture now","Upload from gallery"}; AlertDialog.Builder lAlertDialog = new AlertDialog.Builder(cContext); lAlertDialog.setTitle("Upload action"); lAlertDialog.setCancelable(true); lAlertDialog.setItems(items, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialogInterface, int i){ //Toast.makeText(getApplicationContext(), "Selected item: " +i, Toast.LENGTH_SHORT).show(); if (i == 0){ attachCameraImage(); } if (i == 1){ attachGalleryImage(); } } }); lAlertDialog.setIcon(R.drawable.click_to_url); lAlertDialog.show(); return true; } public void attachGalleryImage(){ Intent getImageFromGalleryIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI); startActivityForResult(getImageFromGalleryIntent, MEDIA_IMAGE_REQUEST_CODE); } public void attachCameraImage(){ String fileName = "testphoto.jpg"; ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.TITLE, fileName); values.put(MediaStore.Images.Media.DESCRIPTION,"Image capture by camera"); values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); cImageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, cImageUri); intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); startActivityForResult(intent, CAMERA_IMAGE_REQUEST_CODE); } protected final void onActivityResult(final int requestCode, final int resultCode, final Intent i) { Log.d(Global.TAG,"--> Received callback with:" + resultCode); super.onActivityResult(requestCode, resultCode, i); if(resultCode == RESULT_OK) { Log.d(Global.TAG,"--> Result OK with:" + requestCode); switch(requestCode) { case MEDIA_IMAGE_REQUEST_CODE: Log.d(Global.TAG,"--> MEDIA_IMAGE_REQUEST_CODE"); Gui.GuiProgressDialog.showLoadingSpinner(cActivity); cImageUri = i.getData(); if (cImageUri == null){Log.d(Global.TAG,"--> ImageURI is null!");} Lmt.serviceBinder.serviceThread("uploadMemberPicture"); break; case CAMERA_IMAGE_REQUEST_CODE: Log.d(Global.TAG,"--> CAMERA_IMAGE_REQUEST_CODE"); //cImageUri = i.getData(); if (cImageUri == null){Log.d(Global.TAG,"--> ImageURI is null!");} Lmt.serviceBinder.serviceThread("uploadMemberPicture"); break; } } } } 

    Puede utilizar una actividad personalizada para ello. Basta con diseñar la actividad e incluirla como Preferencia en sus preferencias.

     <PreferenceScreen android:summary="@string/pref_summary" android:title="@string/title_summary"> <intent android:action="android.intent.action.MAIN" android:targetPackage="targetPackage" android:targetClass="targetClass"/> </PreferenceScreen> 

    ¡No olvide registrar su actividad en el manifiesto!

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.