我已经实现了一个自定义视图,主机有两个子视图,这些子视图由xml中的id标识。当在同一布局中使用这个自定义视图中的两个时,我遇到的问题是随机选择了哪个自定义视图。
如何使用可在同一布局中多次使用的不同视图ID编写自定义视图?
以下是自定义视图的xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<EditText
android:id="@+id/clearable_edit"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="textCapWords"
android:paddingRight="35dip" />
<Button
android:id="@+id/clearable_button_clear"
android:layout_width="30dip"
android:layout_height="30dip"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="5dip"
android:background="@drawable/clear_button" />
</RelativeLayout>
EditText的id(android:id =“@ + id / clearable_edit”)是这里的问题。
使用自定义视图:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<com.custom.package.ClearableEditText
android:id="@+id/arr_location"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
</com.custom.package.ClearableEditText>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<com.custom.package.ClearableEditText
android:id="@+id/dep_location"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
</com.custom.package.ClearableEditText>
</LinearLayout>
在此示例中,“ClearableEditText”类型的视图与其EditText子视图共享相同的ID。
以下是ClearableEditText的代码:
public class ClearableEditText extends RelativeLayout {
private LayoutInflater inflater = null;
private EditText edit_text;
private Button btn_clear;
public ClearableEditText(Context context, AttributeSet attrs, int defStyle){
super(context, attrs, defStyle);
initViews();
}
public ClearableEditText(Context context, AttributeSet attrs){
super(context, attrs);
initViews();
}
public ClearableEditText(Context context){
super(context);
initViews();
}
private void initViews(){
inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.clearable_edittext, this, true);
edit_text = (EditText) view.findViewById(R.id.clearable_edit);
btn_clear = (Button) findViewById(R.id.clearable_button_clear);
btn_clear.setVisibility(RelativeLayout.INVISIBLE);
}
}
答案 0 :(得分:1)
首先获取父View
,如下所示:
View v1 = findViewById(R.id.arr_location);
然后
EditText ed1 = (EditText)v1.findViewById(R.id.clearable_edit);
类似地
View v2 = findViewById(R.id.dep_location);
EditText ed2 = (EditText)v2.findViewById(R.id.clearable_edit);
通过这种方式,您可以为ClearableEditText
和EditText
添加尽可能多Button
个ClearableEditText
个ID。只需确保每个R.id.arr_location
都有不同的ID,例如在这种情况下R.id.dep_location
和{{1}}。
答案 1 :(得分:0)
我找到了解决方案。
我在ClearableEditText中添加了一个方法,您可以在该对象外部设置底层EditText的id,并使用新的id设置它。
以下是代码示例:
//inside ClearableEditText
public void setEditId(int id){
edit_text.setId(id);
}
//somewhere else
departureLocation = (ClearableEditText)view.findViewById(R.id.dep_location);
departureLocation.setEditId(R.id.clearable1);
arrivalLocation = (ClearableEditText)view.findViewById(R.id.arr_location);
arrivalLocation.setEditId(R.id.clearable2);
在values文件夹中使用“ids.xml”创建ID,这会导致eclipse / ADT为输入的项目创建占位符ID
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- This file is used to create unique ids for custom views, which will be used more
than once in the same layout file. Using unique ids prevents the custom view from getting
the wrong state. -->
<item name="clearable1" type="id"></item>
<item name="clearable2" type="id"></item>
</resources>