我正在使用此处找到的 IconPreferenceScreen 类来创建一个带有右侧删除图标的首选项列表。
这是我使用的代码:
protected void updateFavoritesCategory() {
PreferenceCategory favsCategory = (PreferenceCategory) findPreference("pref_category_favs");
favsCategory.removeAll();
List<Favorite> favs = myAppDB.getFavorites();
for (Favorite f : favs) {
String stName = StringUtils.unescapeHTML(f.getName());
stName = URLDecoder.decode(stName);
IconPreferenceScreen favPreference = new IconPreferenceScreen(this, R.drawable.ic_delete, f.getId().toString());
favPreference.setIconClickedListener(this);
favPreference.setTitle(stName);
favsCategory.addPreference(favPreference);
}
}
此代码在 Gingerbread 上运行良好:
如您所见,它显示了标题、摘要和图标,但在 ICS+ 设备上,我只看到一个空白条目,没有文本,根本没有图标,当我单击每个元素时,我没有得到突出显示的效果:
这是每个列表元素的 XML:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+android:id/widget_frame"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:gravity="center_vertical"
android:minHeight="56dp"
android:padding="10dp"
android:paddingEnd="?android:attr/scrollbarSize" >
<ImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="false"
android:layout_alignParentLeft="false"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_gravity="center"
android:layout_margin="5dp"
android:contentDescription="@null"
android:src="@drawable/ic_delete" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_alignBottom="@+id/icon"
android:layout_alignParentLeft="true"
android:layout_toLeftOf="@+id/icon"
android:gravity="center_vertical"
android:orientation="vertical" >
<TextView
android:id="@+android:id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:fadingEdge="horizontal"
android:gravity="center_vertical"
android:singleLine="true"
android:text="Name"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+android:id/summary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Small Text"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textSize="12sp" />
</LinearLayout>
</RelativeLayout>
关于为什么会发生这种情况的任何想法?
PS:为了更快地参考,这里是 IconPreferenceScreen 类。我对其进行了一些修改,以便在用户单击图标时添加一个事件侦听器:
public class IconPreferenceScreen extends Preference implements OnClickListener {
private final Drawable mIcon;
private static String mType;
private Context mContext;
private String tag = "";
private IconClickedListener iconClickedListener;
public interface IconClickedListener
{
public void onClick(String tag);
}
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);
mContext = context;
setLayoutResource(R.layout.preference_icon);
mIcon = context.getResources().getDrawable(iconRes);
}
public IconPreferenceScreen(Context context, int iconRes, String tag) {
this(context, null, iconRes);
mContext = context;
this.tag = tag;
}
@Override
public void onBindView(View view) {
super.onBindView(view);
ImageView imageView = (ImageView) view.findViewById(R.id.icon);
imageView.setOnClickListener(this);
if (imageView != null && mIcon != null) {
imageView.setImageDrawable(mIcon);
}
}
@Override
public void onClick(View v) {
iconClickedListener.onClick(tag);
}
public IconClickedListener getIconClickedListener() {
return iconClickedListener;
}
public void setIconClickedListener(IconClickedListener iconClickedListener) {
this.iconClickedListener = iconClickedListener;
}
}