Cómo agregar icons a Preferencia

Estoy haciendo una aplicación que amplía la actividad de preferencia y quiero agregar un ícono a cada preferencia.

Leí una pregunta similar, y esta es la respuesta con más reputación:

CommonsWare dice:

La aplicación de Configuración usa una subclase PreferenceScreen personalizada privada para tener el ícono – IconPreferenceScreen. Son 51 líneas de código, incluidos los comentarios, aunque también requiere algunos atributos personalizados. La opción más simple es clonar todo eso en su proyecto, aunque eso no le guste.

Pero no puedo hacer que funcione. Por ahora cloné la clase IconPreferenceScreen en mi proyecto. Y no sé lo que tengo que hacer después de esto. Estoy intentando hacer una nueva IconPreferenceScreen. No puedo hacer que funcione.

IconPreferenceScreen test = new IconPreferenceScreen(); test.setIcon(icon); 

Hoy puedes usar android: icon attr disponible desde API 11 🙂

¡Después de muchas pruebas y muchos errores pude obtenerlo!

Tuve que hacer esto:

1 – Clona la clase IconPreferenceScreen desde la aplicación de configuración nativa de Android (gracias CommonWare)

2 – Clona el archivo de diseño preference_icon.xml desde la aplicación de Configuración de Android.

3 – Declare IconPreferenceScreen con estilo en el archivo attrs.xml:

       

4 – Declare IconPreferenceScreen en el archivo preference.xml:

  

5 – Finalmente configure el icono para la preferencia, en la clase de preferencia:

 addPreferencesFromResource(R.xml.example); IconPreferenceScreen test = (IconPreferenceScreen) findPreference("key1"); Resources res = getResources(); Drawable icon = res.getDrawable(R.drawable.icon1); test.setIcon(icono1); 

Gracias de nuevo a CommonsWare por decirme dónde comenzar y por su explicación.

Esta es la clase IconPreferenceScreen clonada:

 package com.app.example; import android.content.Context; import android.content.res.TypedArray; import android.graphics.drawable.Drawable; import android.preference.Preference; import android.util.AttributeSet; import android.view.View; import android.widget.ImageView; public class IconPreferenceScreen extends Preference { private Drawable mIcon; public IconPreferenceScreen(Context context, AttributeSet attrs) { this(context, attrs, 0); } public IconPreferenceScreen(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setLayoutResource(R.layout.preference_icon); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.IconPreferenceScreen, defStyle, 0); mIcon = a.getDrawable(R.styleable.IconPreferenceScreen_icon); } @Override public void onBindView(View view) { super.onBindView(view); ImageView imageView = (ImageView) view.findViewById(R.id.icon); if (imageView != null && mIcon != null) { imageView.setImageDrawable(mIcon); } } public void setIcon(Drawable icon) { if ((icon == null && mIcon != null) || (icon != null && !icon.equals(mIcon))) { mIcon = icon; notifyChanged(); } } public Drawable getIcon() { return mIcon; } } 

Y este es el diseño clonado de preference_icon.xml:

        

La mejor y más fácil manera de lograr lo que desea es hacer que el ícono sea un ícono de 9 parches con el borde derecho como el área estirable.

Supongamos que tiene una EditTextPreference a la que desea agregar un icono antes del título y el resumen.

Usted crea una clase MyEditTextPreference que extiende EditTextPreference y anula el método getView para agregar su icono de 9 parches como recurso de fondo.

Aquí hay un código de muestra que funciona:

 public class MyEditTextPreference extends EditTextPreference { public MyEditTextPreference(Context context, AttributeSet attrs) { super(context, attrs); } @Override public View getView(View convertView, ViewGroup parent) { View view = super.getView(convertView, parent); view.setBackgroundResource(R.drawable.my_icon); return view; } } 

Dado que el ícono es un parche de 9, el ícono extenderá la parte transparente hasta el extremo derecho de la celda, colocando el ícono en el lado izquierdo.

Esta es una solución muy limpia para su problema.

Estoy creando una aplicación porque PreferenceActivity es la actividad principal y quiero agregar un icono a cada Preferencia personalizada. Me gusta esta imagen:

Esa no es una actividad de PreferenceActivity .

¿Cómo puedo agregar un ícono a PreferenceScreen?

Será más simple para usted crear su propia actividad que le permita guardar sus preferencias.

Personalmente, me saltaría el ícono y usaré el sistema regular PreferenceScreen y PreferenceActivity .

Gracias a:

Lo siguiente funcionó para mí:

AndroidManifest.xml

            

res / values ​​/ strings.xml:

   YOUR_APP_NAME About  

res / values ​​/ attrs.xml:

       

res / layout / main.xml:

        

res / layout / preference_icon.xml:

         

Íconos de tamaño adecuado en:

 res/drawable-hdpi/YOUR_ICON.png res/drawable-mdpi/YOUR_ICON.png res/drawable-ldpi/YOUR_ICON.png 

AndroidMain.scala:

 class AndroidMain extends PreferenceActivity { override def onCreate(savedInstanceState: Bundle) { super.onCreate(savedInstanceState) addPreferencesFromResource(R.layout.main) } } 

IconPreference.scala:

 class IconPreference(context: Context, attrs: AttributeSet, defStyle: Int) extends Preference(context, attrs, defStyle) { def this(context: Context, attrs: AttributeSet) = this(context, attrs, 0) setLayoutResource(R.layout.preference_icon); val a: TypedArray = context.obtainStyledAttributes(attrs, R.styleable.IconPreference, defStyle, 0); val _icon: Drawable = a.getDrawable(R.styleable.IconPreference_icon); override def onBindView(view: View) { super.onBindView(view) val imageView: ImageView = view.findViewById(R.id.icon).asInstanceOf[ImageView] if (imageView != null && _icon != null) { imageView.setImageDrawable(_icon); } } } 

demasiado tarde, pero tal vez ayude a alguien, el problema es que puede agregar el ícono hijo único de una categoría, como este es mi código de muestras. solo se puede ver el ícono de edición de texto en la pantalla.

        

resultado:

enter image description here

Para una respuesta “sensata”, puede usar el método de 9 parches tal como lo describe Henrique Rocha o puede usar lo siguiente:

Cree una nueva clase de Preferencia que amplíe EditTextPreference y permita que Override onCreateView.

 @Override protected View onCreateView(ViewGroup parent) { View v = LayoutInflater.from(getContext()).inflate(R.layout.iconpreference, null); return v; } 

Cree un nuevo Layout XML llamado iconpreference y en este XML puede dejar que incluya un diseño de preferencia estándar. Puede ajustarlo básicamente de la forma que desee. Ejemplo fácil:

       

¡Eso es todo!

Cuando necesite una preferencia de la lista con {text and icon} puede echar un vistazo a esta listapreferencia con íconos

Prueba esto:

 PreferenceScreen root = getPreferenceManager().createPreferenceScreen(this); PreferenceScreen ps= getPreferenceManager().createPreferenceScreen(this); ps.setKey("ps"); ps.setLayoutResource(R.layout.your_layout); root.addPreference(ps);