2010-04-15 13 views
11

Me gustaría que algunas de mis preferencias tengan iconos, como la aplicación Configuración.Usar íconos en las preferencias de Android

Supongo que una forma de hacer esto sería copiar todos los códigos y recursos relevantes de la aplicación de Configuración, pero parece exagerado para un par de iconos.

Además, no me gusta la idea de tener que duplicar el código y los recursos en cada proyecto que requiere iconos de configuración.

¿Alguien ha resuelto esto ya con un enfoque más simple o sin recursos?

+0

No lo entiendo, ¿por qué no puedes usar un diseño personalizado? http://developer.android.com/reference/android/preference/Preference.html#setLayoutResource%28int%29 –

Respuesta

9

La aplicación de configuración utiliza una subclase privada personalizada PreferenceScreen para tener el icono - 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.

source code

+0

Si solo se pueden compartir recursos entre proyectos. Esperaba que alguien resolviera esto y lo envolvió en una buena clase sin ningún recurso externo. – hpique

+0

Debe tenerse en cuenta que el enfoque de la aplicación Configuración amplía Preferencia, no PreferenceScreen y que también requiere un diseño personalizado para funcionar. – hpique

+0

el código fuente vinculado da un 404 – Shine

5

Actualizado .... contestado y trabajando

Usar un diseño personalizado para la preferencia icono

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+android:id/widget_frame" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:minHeight="?android:attr/listPreferredItemHeight" 
    android:gravity="center_vertical" 
    android:paddingRight="?android:attr/scrollbarSize"> 
    <ImageView 
     android:id="@+id/icon" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="6dip" 
     android:layout_marginRight="6dip" 
     android:layout_gravity="center" /> 
    <RelativeLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="2dip" 
     android:layout_marginRight="6dip" 
     android:layout_marginTop="6dip" 
     android:layout_marginBottom="6dip" 
     android:layout_weight="1"> 
     <TextView android:id="@+android:id/title" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:singleLine="true" 
      android:textAppearance="?android:attr/textAppearanceLarge" 
      android:ellipsize="marquee" 
      android:fadingEdge="horizontal" /> 
     <TextView android:id="@+android:id/summary" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@android:id/title" 
      android:layout_alignLeft="@android:id/title" 
      android:textAppearance="?android:attr/textAppearanceSmall" 
      android:maxLines="2" /> 
    </RelativeLayout> 
</LinearLayout> 

y la clase importada para IconPreferenceScreen

public class IconPreferenceScreen extends Preference { 
    private final Drawable mIcon; 
    private static String mType; 

    public IconPreferenceScreen(Context context, AttributeSet attrs, int iconRes) { 
     this(context, attrs, 0, iconRes); 
    } 
    public IconPreferenceScreen(Context context, AttributeSet attrs, 
      int defStyle, int iconRes) { 
     super(context, attrs, defStyle); 
     setLayoutResource(R.layout.preference_icon); 
     mIcon = context.getResources().getDrawable(iconRes); 
    } 
    public IconPreferenceScreen(Context context, int iconRes) { 
     this(context, null, iconRes); 
    } 
    @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); 
     } 
    } 
} 

entonces puedes usar una nueva IconPreferenceScreen en su lugar de una preferencia, y agregue un ícono

+1

Registrar en attrs.xml de la aplicación de configuración. – hpique

1

Android 3.x Honeycomb muestra los iconos definidos en Preferencias estándar.

Por lo tanto, probablemente el uso del icono dependa de la versión del sistema operativo Android o del tamaño de la pantalla.

+0

Depende de la versión de Android, ver mi respuesta más arriba. – keaukraine

Cuestiones relacionadas