titulo studio personalizar iconos icono color cambiar boton barra bar agregar android icons screen preferences

personalizar - cambiar icono menu android studio



Cómo agregar iconos a la preferencia (9)

Estoy creando 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 decir:

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

Pero no puedo hacer que funcione. Por ahora cloné la clase IconPreferenceScreen a mi proyecto. Y no sé qué tengo que hacer después de esto. Estoy tratando de hacer un nuevo IconPreferenceScreen No puedo hacer que funcione ...

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


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

Eso no es una actividad de PreferenceActivity .

¿Cómo puedo agregar un icono a la PreferenceScreen?

Será más sencillo para usted simplemente crear su propia actividad que suceda para guardar las preferencias.

Personalmente, solo me saltearía el icono y utilizaría el sistema regular PreferenceScreen y PreferenceActivity .


Bueno, demasiado tarde, pero tal vez esto ayude a alguien. El problema es que puede agregar un ícono único de una categoría, como son mis ejemplos de código. en la pantalla solo se puede ver el icono de edición de texto.

<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:title="@string/pref_profil" android:icon="@drawable/profile" // it wont show android:key="pref_key_storage_settings"> <EditTextPreference android:key="edit_text_preference_1" android:selectAllOnFocus="true" android:singleLine="true" android:icon="@drawable/profile" android:title="Edit text preference" /> <Preference android:key="pref_key_sms_delete_limit" android:summary="HELLO2" android:title="HELLO" /> </PreferenceCategory> </PreferenceScreen>

resultado:


Cuando necesite una referencia de lista con {texto e icono} puede echar un vistazo a esta referencia de lista con iconos


Después de muchas pruebas y muchos errores pude conseguirlo!

Tuve que hacer esto:

1 - Clone la clase IconPreferenceScreen desde la aplicación de configuración nativa de Android (gracias a CommonWare)

2 - Clone el archivo de diseño preferences_icon.xml desde la aplicación Configuración de Android.

3 - Declare el IconPreferenceScreen styleable en el archivo attrs.xml:

<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="IconPreferenceScreen"> <attr name="icon" format="reference" /> </declare-styleable> </resources>

4 - Declare el IconPreferenceScreen en el archivo preferences.xml:

<com.app.example.IconPreferenceScreen android:title="IconPreferenceScreen Title" android:summary="IconPreferenceScreen Summary" android:key="key1" />

5 - Finalmente establezca 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 por dónde empezar 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 de preferencia clonada.icon.xml:

<LinearLayout android:id="@+android:id/iconpref" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_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>


Gracias a:

Lo siguiente me funcionó:

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="YOUR.PACKAGE.NAME"> <application android:label="@string/app_name" android:icon="@drawable/icon"> <activity android:name="AndroidMain" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>

res / values ​​/ strings.xml:

<?xml version="1.0" encoding="utf-8"?> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name">YOUR_APP_NAME</string> <string name="about">About</string> </resources>

res / values ​​/ attrs.xml:

<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="IconPreference"> <attr name="icon" format="reference" /> </declare-styleable> </resources>

res / layout / main.xml:

<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" xmlns:settings="http://schemas.android.com/apk/res/YOUR.PACKAGE.NAME" > <PreferenceCategory android:title="Main" android:key="mainPrefCat"> <YOUR.PACKAGE.NAME.IconPreference android:title="Exit" android:summary="Quit the app." settings:icon="@drawable/YOUR_ICON" android:key="quitPref"> </YOUR.PACKAGE.NAME.IconPreference> </PreferenceCategory> </PreferenceScreen>

res / layout / preferences_icon.xml:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+android:id/widget_frame" android:layout_width="match_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>

Iconos de tamaño apropiado bajo:

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); } } }


Hoy solo puedes usar android: icon attr disponible desde API 11 :)


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

Digamos que tiene un EditTextPreference que desea agregar un ícono antes del título y el resumen.

Crea una clase MyEditTextPreference que amplía EditTextPreference y anula el método getView para agregar su icono de 9 parches como recurso de fondo.

Aquí hay un código de ejemplo 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 icono es un parche de 9, el icono estirará la parte transparente hasta el extremo derecho de la celda, colocando el icono en el lado izquierdo.

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


Para una respuesta "sana", puede usar el método de 9 parches como lo describe Henrique Rocha o puede usar lo siguiente:

Cree una nueva clase de Preferencia que extienda EditTextPreference y deje que Anule el onCreateView.

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

Cree un nuevo XML de diseño denominado iconpreference y en este XML puede permitir que incluya un diseño de preferencia estándar. Básicamente puedes modificarlo de la forma que quieras. Ejemplo fácil:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <ImageView android:layout_width="48dp" android:layout_height="48dp" android:src="@drawable/checkmark_black"/> <include layout="@layout/preference_holo" /> </LinearLayout>

¡Eso es todo!


Prueba esto:

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