2010-04-15 18 views
11

Vorrei alcune delle mie preferenze per avere icone, come l'app Impostazioni.Uso delle icone nelle preferenze di Android

immagino un modo per farlo sarebbe quello di copiare tutto il codice e le risorse rilevanti dal l'applicazione Impostazioni, ma sembra eccessivo per un paio di icone.

Inoltre non mi piace l'idea di dover duplicare il codice e le risorse in ogni progetto che richiede impostazioni icone.

Qualcuno ha risolto questo già con un approccio più semplice e privo di risorse?

+0

Non capisco, perché non puoi semplicemente usare un layout personalizzato? http://developer.android.com/reference/android/preference/Preference.html#setLayoutResource%28int%29 –

risposta

9

L'applicazione Impostazioni utilizza una sottoclasse privata personalizzata PreferenceScreen per avere l'icona - IconPreferenceScreen. Sono 51 righe di codice, inclusi i commenti, anche se richiede alcuni attributi personalizzati. L'opzione più semplice è quella di clonare tutto ciò nel tuo progetto, anche se non ti piace.

source code

+0

Se solo le risorse potrebbero essere condivise tra i progetti. Ho sperato che qualcuno lo abbia già risolto e lo abbia avvolto in una bella lezione senza risorse esterne. – hpique

+0

Va notato che l'approccio dell'app Impostazioni estende Preferenze, non PreferenceScreen e richiede anche un layout personalizzato per funzionare. – hpique

+0

il codice sorgente collegato dà un 404 – Shine

5

Aggiornato .... risposto e lavorare

Utilizzare un layout personalizzato per l'icona preferenza

<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> 

e la classe importato per 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); 
     } 
    } 
} 

poi puoi semplicemente utilizzare un nuovo IconPreferenceScreen sul posto di una preferenza, e aggiungere un'icona

+1

Arrivo attrs.xml del app Impostazioni. – hpique

1

Android 3.x Honeycomb mostra le icone definite in Preferenze standard.

Quindi, probabilmente l'uso dell'icona dipende dalla versione del sistema operativo Android o dimensioni dello schermo.

+0

Dipende dalla versione di Android, vedere la mia risposta sopra. – keaukraine

Problemi correlati