6

xml の ID で識別される 2 つのサブビューをホストするカスタム ビューを実装しました。このカスタム ビューを同じレイアウトで 2 つ使用すると、どのカスタム ビューがランダムに選択されるかという問題が発生します。

同じレイアウトで複数回使用できる異なるビュー 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);
}
}
4

2 に答える 2

2

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に同じ ID を持つものをいくつでも追加できます。この場合と.EditTextButtonClearableEditTextR.id.arr_locationR.id.dep_location

于 2013-01-29T15:59:52.690 に答える
1

私は解決策を見つけました。

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

ID は値フォルダーの「ids.xml」で作成されます。これにより、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>
于 2013-02-06T13:11:37.900 に答える