我正在创建一个扩展PreferenceActivity的应用程序,我想为每个Preference添加一个图标。
我读了一个类似的问题,这就是声誉更高的答案:
CommonsWare说:
“设置”应用程序使用私有自定义PreferenceScreen子类来显示图标 - IconPreferenceScreen。这是51行代码,包括注释,但它也需要一些自定义属性。最简单的选择是将所有这些克隆到项目中,即使你不喜欢它。
但我不能让它发挥作用。现在我将类IconPreferenceScreen克隆到我的项目中。我不知道在此之后我要做什么。我正在尝试制作一个新的IconPreferenceScreen我无法使它工作..
IconPreferenceScreen test = new IconPreferenceScreen();
test.setIcon(icon);
答案 0 :(得分:37)
今天你可以使用自API 11以来的 android:icon attr:)
答案 1 :(得分:18)
经过多次测试和许多错误,我可以得到它!
我必须这样做:
1 - 从Android原生设置应用中克隆类IconPreferenceScreen(感谢CommonWare)
2 - 从Android设置应用中克隆布局文件preference_icon.xml。
3 - 在文件attrs.xml中声明IconPreferenceScreen可设置样式:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="IconPreferenceScreen">
<attr name="icon" format="reference" />
</declare-styleable>
</resources>
4 - 在preference.xml文件中声明IconPreferenceScreen:
<com.app.example.IconPreferenceScreen
android:title="IconPreferenceScreen Title"
android:summary="IconPreferenceScreen Summary"
android:key="key1" />
5 - 最后在偏好设置类中设置首选项的图标:
addPreferencesFromResource(R.xml.example);
IconPreferenceScreen test = (IconPreferenceScreen) findPreference("key1");
Resources res = getResources();
Drawable icon = res.getDrawable(R.drawable.icon1);
test.setIcon(icono1);
再次感谢CommonsWare告诉我从哪里开始,以及他的解释。
这是克隆的IconPreferenceScreen类:
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;
}
}
这是克隆的preference_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>
答案 2 :(得分:11)
实现目标的最佳和最简单的方法是将图标设为9个补丁图标,右边框作为可伸缩区域。
假设您有一个EditTextPreference,您希望在标题和摘要之前添加一个图标。
创建一个MyEditTextPreference类,它扩展EditTextPreference并覆盖getView方法,将9-patch图标添加为后台资源。
以下是一个有效的示例代码:
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;
}
}
由于图标是9个补丁,图标会将透明部分拉伸到单元格的右端,将图标放在左侧。
对于您的问题,这是一个非常干净的解决方案。
答案 3 :(得分:1)
我正在创建一个应用程序,因为PreferenceActivity是主要活动,我想为每个自定义首选项添加一个图标。喜欢这张图片:
那不是PreferenceActivity
。
如何在PreferenceScreen中添加图标?
您可以更简单地创建自己的活动,以便保存首选项。
就个人而言,我只是跳过图标并使用常规PreferenceScreen
和PreferenceActivity
系统。
答案 4 :(得分:1)
感谢:
以下对我有用:
的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 /值/ 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 /值/ attrs.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="IconPreference">
<attr name="icon" format="reference" />
</declare-styleable>
</resources>
RES /布局/ 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 /布局/ preference_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>
适当大小的图标位于:
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);
}
}
}
答案 5 :(得分:0)
对于一个理智的人来说#34;回答,您可以使用Henrique Rocha所描述的9-patch方法,也可以使用以下方法:
创建一个新的Preference类,扩展EditTextPreference并让它覆盖onCreateView。
@Override
protected View onCreateView(ViewGroup parent)
{
View v = LayoutInflater.from(getContext()).inflate(R.layout.iconpreference, null);
return v;
}
创建一个名为iconpreference的新布局XML,在此XML中,您可以让它包含标准首选项布局。您可以根据需要进行基本调整。 简单示例:
<?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>
多数民众赞成!
答案 6 :(得分:0)
当您需要包含{text and icon}的列表首选项时,您可以查看此listpreference with icons
答案 7 :(得分:-1)
试试这个:
PreferenceScreen root = getPreferenceManager().createPreferenceScreen(this);
PreferenceScreen ps= getPreferenceManager().createPreferenceScreen(this);
ps.setKey("ps");
ps.setLayoutResource(R.layout.your_layout);
root.addPreference(ps);