问题描述
我处于这种情况,我在一个片段中有两个编辑文本,按回去时,第一个编辑文本的值被第二个编辑文本替换。 现在,两个编辑文本都具有相同的值。
<EditText
android:id="@+id/edit_text"
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="20dp"
android:hint="hint" />
上面是我的EditText
,这个EditText在布局内,我已经将该布局包含在片段中两次以获取EditText
,在单击提交时,我将该片段替换为另一个,但是在按下时返回该片段,第一个编辑框的值将被第二个替换。
现在两者具有相同的值。
这就是我要替换的片段。
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.layout_fragment, fragment, tag);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commitAllowingStateLoss();
getSupportFragmentManager().executePendingTransactions();
1楼
您应该为EditText使用不同的ID。
假设EditText在edit_text_layout.xml
定义,包括布局时,请指定其他ID。
在fragment_layout.xml
:
<include
layout="@layout/edit_text_layout"
android:id="@+id/edit_text_1" />
<include
layout="@layout/edit_text_layout"
android:id="@+id/edit_text_2" />
说明:Android将视图的状态保存在SparseArray中,关键是视图的ID。
恢复状态时,具有相同ID的视图将获得相同的状态值。
如果视图没有ID( NO_ID
),则不会保存或恢复其状态。
android.view.View.java
protected void dispatchSaveInstanceState(SparseArray<Parcelable> container) {
if (mID != NO_ID && (mViewFlags & SAVE_DISABLED_MASK) == 0) {
......
if (state != null) {
......
container.put(mID, state);
}
}
}
protected void dispatchRestoreInstanceState(SparseArray<Parcelable> container) {
if (mID != NO_ID) {
Parcelable state = container.get(mID);
if (state != null) {
......
onRestoreInstanceState(state);
......
}
}
}
2楼
您的两个EditText都使用相同的ID。 在您的XML文件中,您需要确保两个编辑文本的ID不同。 即使在单独的XML文件中,它们也必须具有不同的ID。
例如,您可以将其声明更改为...
<EditText
android:id="@+id/edit_text1"
<EditText
android:id="@+id/edit_text2"
3楼
我知道这是一个古老的问题,但是我遇到了一个非常相似的问题,尽管当前答案是正确的(它是重复的ID问题),但是给出的实际答案在正确的地方还是行不通。
我有一个片段,在那个片段中,我有2个自定义控件,它们都具有唯一的ID,但是在这些控件内部,它们包含相同的通用布局,因此Layout当然具有两个具有相同ID的EditText。
@wrkwrk是正确的,因为它是一个ID问题,但是如果包含的布局包含EditText,则更改“ include”上的ID是不够的,并且如果您想多次包含相同的布局,则不能给它axml中的其他ID。
因此,对于我的变通方法,在用于加载EditText的自定义控件的代码中,在加载后,我简单地使用View.GenerateViewId()函数更改了ID。
像这样(在C#/ Xamarin中)
var editText = _root.FindViewById<EditText>(Resource.Id.entryEditText);
editText.Id = GenerateViewId();
这似乎为我解决了问题。 因此,我可以在布局中使用一个公共ID,以便我的控件可以很好地找到它,但是随后它会更改,因此片段中该控件的多个实例将在返回时很好地保存其EditText状态。
或者,您可以在布局中不给它ID,而是给Tag,然后执行FindViewByTag,然后在加载后为其分配ID。