Использование значков в настройках Android - PullRequest
11 голосов
/ 15 апреля 2010

Мне бы хотелось, чтобы некоторые из моих предпочтений имели значки, например, приложение «Настройки».

Полагаю, что одним из способов сделать это было бы скопировать весь соответствующий код и ресурсы из приложения «Настройки», но это кажется излишним для пары иконок.

Также мне не нравится идея дублирования кода и ресурсов в каждом проекте, для которого требуются значки настроек.

Кто-нибудь уже решил это с помощью более простого или безресурсного подхода?

Ответы [ 4 ]

9 голосов
/ 15 апреля 2010

Приложение «Настройки» использует собственный подкласс PreferenceScreen, чтобы значок - IconPreferenceScreen. Это 51 строка кода, включая комментарии, хотя он также требует некоторых пользовательских атрибутов. Самый простой вариант - клонировать все это в свой проект, даже если вам это не нравится.

исходный код

7 голосов
/ 02 января 2013

Начиная с уровня API 11, вы можете добавить значок в настройки:

http://developer.android.com/reference/android/preference/Preference.html#setIcon%28int%29

http://developer.android.com/reference/android/preference/Preference.html#attr_android:icon

Для более старых версий Android вы должны использовать пользовательские макеты и связывать изображения в коде, как предлагает @ roger-l.

5 голосов
/ 16 апреля 2010

Обновлено .... ответил и работает

Использовать пользовательский макет для предпочтения значка

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

и импортированный класс для 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);
        }
    }
}

тогда вы можете просто использовать новый IconPreferenceScreen вместо предпочтения и добавить значок

1 голос
/ 21 сентября 2011

Android 3.x Honeycomb показывает значки, определенные в стандартных настройках.

Так что, вероятно, использование значка зависит от версии ОС Android или размера экрана.

...