同一个android复合组件的多个实例

时间:2015-11-02 21:19:27

标签: android custom-component

我有一个自定义的EditText组件(复合组件,基于LinearLayout),我在同一个Activity中使用多个实例。 自定义组件按预期工作,但是,当我旋转ui时,在第二个组件中输入的文本会突然复制到第一个组件。否则,两个自定义组件的功能完全符合预期。 两个组件在活动布局中都具有唯一ID。

以下是我的客户组件的代码:

public class MyEditText extends LinearLayout{
private EditText mEditText;
TextView mTextCounter;
private int errorIconRes;
private String textHint;
private boolean showLength;
private int maxCount;
private int lines;
private boolean phoneField;

private String errorMessage;

    public MyEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ZipEditText, 0, 0);

    phoneField = a.getBoolean(R.styleable.ZipEditText_phone, false);
    errorIconRes = a.getInt(R.styleable.ZipEditText_icon_err, R.drawable.form_error_icon);
    textHint = a.getString(R.styleable.ZipEditText_hint);
    maxCount = a.getInt(R.styleable.ZipEditText_maxLength, 100);
    lines = a.getInt(R.styleable.ZipEditText_lines, 1);
    showLength = a.getBoolean(R.styleable.ZipEditText_showLength, false);

    a.recycle();
   LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View v = inflater.inflate(R.layout.comp_zip_edittext, this, true);
    mEditText = (EditText) v.findViewById(R.id.text_field);
    mEditText.addTextChangedListener(getTextWatcher());

    if (textHint!= null)mEditText.setHint(textHint);
    mImageViewError =  (ImageView) v.findViewById(R.id.icon_error);
    mTextCounter = (TextView) v.findViewById((R.id.text_counter));



    if (lines>1 && !phoneField) {
        mEditText.setLines(lines);
        mEditText.setSingleLine(false);
    }
    if (showLength) {
        mTextCounter.setVisibility(View.VISIBLE);
        mEditText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(maxCount)});
        mEditText.addTextChangedListener(getTextWatcherLength());
    } else {
        mTextCounter.setVisibility(View.GONE);
    }

以下是我的自定义组件的布局文件:          

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_gravity="center_horizontal"
        android:gravity="center_horizontal">

        <EditText
            android:id="@+id/text_field"
            android:layout_height="wrap_content"
            android:layout_width="fill_parent"
            android:gravity="left"
            android:paddingLeft="10dp"
            android:singleLine="true"
            android:inputType="textNoSuggestions"
            android:layout_alignParentTop="true"
            />

        <ImageView
            android:id="@+id/icon_error"
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:src="@drawable/form_error_icon"
            android:layout_marginTop="10dp"
            android:layout_marginRight="15dp"
            android:layout_alignRight="@id/text_field"
            android:layout_alignTop="@id/text_field"
            android:visibility="gone"/>
    </RelativeLayout>
    <TextView
        android:id="@+id/text_counter"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:text="Small Text"
        android:layout_gravity="right"
        android:visibility="gone"/>
</LinearLayout>

这是我的活动布局文件:

   <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:zip="http://schemas.android.com/apk/res-auto"
    android:layout_width="fill_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:layout_gravity="center_horizontal"
    android:gravity="center_horizontal"
    android:background="@color/white" >


    <TextView
        android:id="@+id/error_msg"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:gravity="center"
        android:textSize="18sp"
        android:textColor="@color/home_image_red"
        android:background="@color/zip_error_gray"
        android:text="Something went wrong"
        android:visibility="gone"
        />
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:paddingLeft="20dp"
        android:paddingRight="20dp"
        android:layout_gravity="center_horizontal"
        android:gravity="center_horizontal"
        android:background="@color/white" >

        <TextView
            android:id="@+id/upsell"
            android:layout_width="wrap_content"
            android:layout_height="60dp"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:gravity="center"
            android:textSize="18sp"
            android:text="Sign in to use all our features."
            />


        <com.myproject.android.components.MyEditText
            android:id="@+id/request_phone"
            android:layout_height="wrap_content"
            android:layout_width="fill_parent"
            android:layout_marginTop="5dp"
            android:gravity="left"
            android:singleLine="true"
            zip:phone="true"
            zip:hint="@string/hint_phone"/>

        <com.myproject.android.components.MyEditText
            android:id="@+id/request_comments"
            android:layout_height="wrap_content"
            android:layout_width="fill_parent"
            android:layout_marginTop="5dp"
            android:gravity="left"
            zip:lines="3"
            zip:maxLength="120"
            zip:showLength="true"
            zip:hint="@string/hint_comments"/>

        <CheckBox
            android:id="@+id/checkbox_request_visit"
            style="@style/contact_label"
            android:layout_centerInParent="true"
            android:text="@string/check_home_visit"
            android:checked="false" />

        <Button
            android:id="@+id/request_button"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:layout_marginBottom="5dp"
            android:layout_marginLeft="15dp"
            android:layout_marginRight="15dp"
            android:text="Request a Showing"
            android:textColor="@color/pbz_button_primary_foreground_color"
            android:textStyle="bold"
            android:background="@drawable/button_registration"
            android:gravity="center"/>

        <TextView
            android:id="@+id/terms_link"
            style="@style/FinePrint"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="15dp"
            android:layout_marginRight="15dp"
            android:gravity="center_horizontal"
            android:paddingBottom="5dp"
            android:text="@string/request_showing_terms"
            />
    </LinearLayout>
</LinearLayout>

2 个答案:

答案 0 :(得分:0)

问题出在EditText组件的相同ID中。尝试删除它id,并通过从xml中膨胀每个视图并将其添加到复杂布局来单独创建自定义组件。

答案 1 :(得分:0)

我想出了如何做到这一点:不是通过id加载组件,而是解析树并通过树中的位置加载它:

而不是

mEditText = (EditText) v.findViewById(R.id.text_field);

这样做:

LinearLayout linearLayout = (LinearLayout) getChildAt(0);
mEditText = (EditText) relativeLayout.getChildAt(0);

这样,在旋转

之后重新创建活动/片段时,可以避免加载错误的组件