在我的Android项目中,我需要通过标签而不是ID来查找Activity中的视图。 (如果你问我为什么不简单地使用findViewById
,这不是我喜欢的,描述起来很复杂,但目前我不能依赖R.id.
常数!)
到目前为止,为了在我的代码中查找视图,我成功地使用了它:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.index);
mainViewGroup = (ViewGroup)getWindow().getDecorView();
TextView indexCaption = (TextView) mainViewGroup.findViewWithTag("index_caption");
// Now I have my TextView and can use it without problem
}
但现在,问题是我在相同活动中的自定义ArrayAdapter:
class IconicAdapter extends ArrayAdapter<String> {
IconicAdapter() {
// How I can use Tag instead of R.layout.index_row_caption here?!!!
super(IndexActivity.this, R.layout.index_row, R.id.index_row_caption, arrayList);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = super.getView(position, convertView, parent);
// Some customizations...
return (row);
}
}
IconicAdapter的和index_row.xml
:
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/content_bg" >
<TextView
android:id="@+id/index_row_caption"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toLeftOf="@+id/index_row_icon"
android:layout_toRightOf="@+id/index_row_search"
android:gravity="right"
android:tag="index_row_caption"
android:textAppearance="?android:attr/textAppearanceLarge" />
<ImageView
android:id="@+id/index_row_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:tag="index_row_icon" />
<ImageView
android:id="@+id/index_row_search"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:src="@drawable/index_row_search"
android:tag="index_row_search" />
如何避免在构造函数中使用R.id.index_row_caption
并将其替换为与其标记相关的内容?
编辑:最后,我已经完成了这段代码并且工作得很好:(学分和奖励适用于帮助我的pawelzieba)
class IconicAdapter extends ArrayAdapter<String> {
IconicAdapter() {
super(IndexActivity.this, R.layout.index_row, 0, arrayList);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
if (convertView == null) {
LayoutInflater mInflater = IndexActivity.this.getLayoutInflater();
view = mInflater.inflate(R.layout.index_row, parent, false);
} else {
view = convertView;
}
//find views
TextView text = (TextView) view.findViewWithTag("index_row_caption");
//fill views with data
text.setText(arrayList.get(position));
return view;
}
}
答案 0 :(得分:2)
扩展ArrayAdapter
并覆盖getView()
方法。
public View getView(int position, View convertView, ViewGroup parent) {
View view;
if (convertView == null) {
view = mInflater.inflate(R.layout.index_row, parent, false);
} else {
view = convertView;
}
//find views
TextView text = (TextView) view.findViewWithTag("index_row_caption");
//fill views with data
//example:
T item = getItem(position);
text.setText(item.toString());
return view;
}
然后,未使用传递给构造函数的行资源ID。
为了获得更好的性能,请使用View Holder Pattern在创建行视图时仅调用一次findViewWithTag:http://www.vogella.com/articles/AndroidListView/article.html#adapterperformance_hoder
答案 1 :(得分:1)
如果要将R.id值用作常量,可以在public.xml中声明它们。资源ID将在整个构建中保持不变。所以你不必使用标签只是因为你需要恒定的ID。
选中此post
答案 2 :(得分:0)
您可以通过以下方式执行此操作:
将android:tag="someTag"
属性添加到view
布局文件中的xml
。
要访问该视图,只需使用:
findViewByTag(); method
通过这种方式,您可以通过标签而非ID来访问您的视图。