2016-04-08 9 views
0

の開発をスピードアップするこのeditTextをラベル付きで作成しました。Android EditTextのマージレイアウトのカスケードコピーの問題

これはクラスです:

public class EditTextWithLabel extends LinearLayout { 

    @InjectView(R.id.text_edittext_with_label) 
    protected TextView label; 

    @InjectView(R.id.edittext_edittext_with_label) 
    protected EditText editText; 

    public EditTextWithLabel(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(context); 
     getAttributes(context, attrs); 
    } 

    ... 

    private void init(Context context) { 
     LayoutInflater.from(context).inflate(R.layout.layout_edittext_with_label, this, true); 
     ButterKnife.inject(this); 

     setOrientation(VERTICAL); 
    } 

    private void getAttributes(Context context, AttributeSet attrs) { 
     TypedArray a = context.obtainStyledAttributes(attrs, 
       R.styleable.EditTextWithLabel, 0, 0); 

     try { 

      CharSequence label = a.getText(R.styleable.EditTextWithLabel_label); 
      if (!TextUtils.isEmpty(label)) 
       setLabel(label); 

      CharSequence text = a.getText(R.styleable.EditTextWithLabel_android_text); 
      if (!TextUtils.isEmpty(text)) 
       setText(text); 

      CharSequence hint = a.getText(R.styleable.EditTextWithLabel_android_hint); 
      if (!TextUtils.isEmpty(hint)) 
       setHint(hint); 

      int maxLength = a.getInt(R.styleable.EditTextWithLabel_android_maxLength, -1); 
      if (maxLength > 0) 
       setMaxLength(maxLength); 

      int type = a.getInt(R.styleable.EditTextWithLabel_android_inputType, InputType.TYPE_CLASS_TEXT); 
      setInputType(type); 

     } finally { 
      a.recycle(); 
     } 
    } 

    ... 
} 

そして、これはxmlです:

<?xml version="1.0" encoding="utf-8"?> 
<merge xmlns:android="http://schemas.android.com/apk/res/android"> 

    <TextView 
     android:id="@+id/text_edittext_with_label" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="@dimen/edit_text_radius" 
     android:paddingBottom="5dp" 
     android:text="@string/username" 
     android:textColor="@color/text" 
     android:textSize="@dimen/text_edit_text" 
     /> 

    <EditText 
     android:id="@+id/edittext_edittext_with_label" 
     style="@style/EditText" 
     android:inputType="textEmailAddress"/> 

</merge> 

私はフラグメントにこれらの多くを置けば​​、私はそれを復元する際ALL editTextsが表示されていることが分かりました最後のものに書かれたテキスト。

私はこの動作を説明することができないので、誰かが私を光らせてくれることを願っています。

はあなたに私はこの問題を解決することができたJ.ダウの答えに

EDIT

感謝をありがとう、私はのinit方法このコードの末尾に追加しました

label.setId((int) System.currentTimeMillis()); 
editText.setId((int) System.currentTimeMillis()); 

これは、問題を回避するために十分なIDをランダム化しました。

答えて

0

マージは基本的に単純なインクルードです。最終的なレイアウトには、EditTextの複数の「コピー」が含まれます。 Androidのドキュメントから

注:id属性:私たちの活動のビューの状態を復元するには、Androidシステムのためには、各ビューは、Androidによって提供される固有のIDを持っている必要があります。

http://developer.android.com/training/basics/activity-lifecycle/recreating.html

あなたのマージされたレイアウトを復元するときにこのように、Androidのシステムは、同じIDを持つ複数のEditTextsが発生したため、同じ状態でそれらのそれぞれを復元します。

+0

ありがとうございました。あなたは非常に明確です。常に同じオブジェクトを使用してレイアウトを最適化する方法はありませんか? –

+1

同じレイアウトを同じフラグメントまたはアクティビティレイアウト内で再利用したい場合は、すべてのビューがこのレイアウト内で一意のIDを持つようにするだけです。また、保存/復元方法を上書きすることもできますが、これはおそらく複雑ではありません。 http://stackoverflow.com/questions/1714297/android-view-setidint-id-programmatically-how-to-avoid-id-conflicts –