rkm*_*max 3 android android-layout
我有一个带有自定义列表项的ListView
<?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="wrap_content"
android:orientation="horizontal" >
<ImageView
android:id="@android:id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/app_name"
android:maxWidth="32dp" />
<TextView
android:id="@android:id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center|left"
android:paddingBottom="4dp"
android:paddingTop="4dp"
android:textIsSelectable="true"
android:textSize="24sp" >
</TextView>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
现在Eclipse警告我This tag and its children can be replaced by one <TextView/> and a compound drawable
.一切正常,但我讨厌警告,现在我改变了观点.
<?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="wrap_content"
android:orientation="horizontal" >
<TextView
android:id="@android:id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center|left"
android:paddingBottom="4dp"
android:paddingTop="4dp"
android:textIsSelectable="true"
android:textSize="24sp"
android:drawableLeft="@drawable/unstarred" >
</TextView>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
但是图像没有显示,可以告诉我布局有什么问题,这是我的适配器
public class CategoryAdapter extends ArrayAdapter<Category> {
private Context mContext;
private int mLayoutResourceId;
private Category mCategories[] = null;
public CategoryAdapter(Context context, int layoutResourceId, Category[] data) {
super(context, layoutResourceId, data);
mContext = context;
mCategories = data;
mLayoutResourceId = layoutResourceId;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
Holder holder = null;
if(null == row) {
row = LayoutInflater.from(mContext).inflate(mLayoutResourceId, parent, false);
holder = new Holder();
holder.mIcon = (ImageView)row.findViewById(android.R.id.icon);
holder.mTitle = (TextView)row.findViewById(android.R.id.title);
row.setTag(holder);
} else {
holder = (Holder) row.getTag();
}
// obviously only one is used at a time
// First layout
final Category category = mCategories[position];
holder.mTitle.setText(category.getName());
holder.mIcon
.setImageResource(category.getStarred() == 1 ? R.drawable.starred : R.drawable.unstarred);
// Second layout
final Category category = mCategories[position];
final Drawable icon = getResources().getDrawable(category.getStarred() == 1 ? R.drawable.starred : R.drawable.unstarred);
holder.mTitle.setText(category.getName());
holder.mTitle.setCompoundDrawables(icon, null, null, null);
return row;
}
}
public static class Holder {
ImageView mIcon;
TextView mTitle;
}
Run Code Online (Sandbox Code Playgroud)
问题是:图像没有显示
我知道这是一个老问题,但仍然相关(至少对我来说;-)),所以也许其他人正在寻找答案。
尽管user4294815的答案非常接近,但没有一个答案实际上描述了问题所在。
发生这种情况的原因是因为#setBounds()
您的图标没有被调用,因此它永远不会有任何大小,除了width = 0
和height = 0
。
此外,如果你有一个看看文档#setCompoundDrawables()
,它实际上指出您需要调用#setBounds()
在Drawable
设置之前Drawable
:
Run Code Online (Sandbox Code Playgroud)/** * Sets the Drawables (if any) to appear to the left of, above, to the * right of, and below the text. Use {@code null} if you do not want a * Drawable there. The Drawables must already have had * {@link Drawable#setBounds} called. * <p> * Calling this method will overwrite any Drawables previously set using * {@link #setCompoundDrawablesRelative} or related methods. * * @attr ref android.R.styleable#TextView_drawableLeft * @attr ref android.R.styleable#TextView_drawableTop * @attr ref android.R.styleable#TextView_drawableRight * @attr ref android.R.styleable#TextView_drawableBottom */
现在要解决这个问题,您可以调用#setBounds()
您的,Drawable
或者如果您不Drawable
直接使用 ,则必须使用#setCompoundDrawablesWithIntrinsicBounds()
或#setCompoundDrawablesRelativeWithIntrinsicBounds()
。后者在今天更合适,因为它不使用left
andright
命名,而是使用start
and end
,因此图标将相对于阅读方向设置。
我知道 rkmax 自己的答案回答了这个问题,或者至少提供了解决方案,但有时这还不够——我认为解释问题的文字更合适,并为下一个看这个问题的人添加了澄清。
归档时间: |
|
查看次数: |
8893 次 |
最近记录: |