具有相同ID的子视图的自定义视图

时间:2013-01-29 15:52:26

标签: android layout

我已经实现了一个自定义视图,主机有两个子视图,这些子视图由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);
}
}

2 个答案:

答案 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);

通过这种方式,您可以为ClearableEditTextEditText添加尽可能多ButtonClearableEditText个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>