Использование значков в настройках Android
Я хотел бы, чтобы некоторые из моих предпочтений имели значки, такие как приложение "Настройки".
Я предполагаю, что одним из способов сделать это было бы скопировать весь соответствующий код и ресурсы из приложения "Настройки", но это похоже на перебор для пары значков.
Также мне не нравится идея дублировать код и ресурсы в каждом проекте, для которого требуются значки настроек.
Кто-нибудь решил это уже с помощью более простого или ресурсосберегающего подхода?
Ответы
Ответ 1
В приложении "Настройки" используется частный пользовательский подкласс PreferenceScreen
, чтобы иметь значок - IconPreferenceScreen
. Это 51 строка кода, включая комментарии, хотя для этого также требуются некоторые пользовательские атрибуты. Самый простой вариант - клонировать все это в ваш проект, даже если вам это не нравится.
исходный код
Ответ 2
Начиная с уровня 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.
Ответ 3
Обновлено.... ответили и работали
Используйте собственный макет для настройки значка
<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 вместо Предпочтения и добавить значок
Ответ 4
Android 3.x Honeycomb показывает значки, определенные в стандартных настройках.
Таким образом, вероятно, использование значка зависит от версии ОС Android или размера экрана.