当前位置: 代码迷 >> Android >> 在Backpress上,EditText值被替换为另一个编辑文本
  详细解决方案

在Backpress上,EditText值被替换为另一个编辑文本

热度:1   发布时间:2023-08-04 10:00:46.0

我处于这种情况,我在一个片段中有两个编辑文本,按回去时,第一个编辑文本的值被第二个编辑文本替换。 现在,两个编辑文本都具有相同的值。

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

您应该为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);
            ......
        }
    }
}

您的两个EditText都使用相同的ID。 在您的XML文件中,您需要确保两个编辑文本的ID不同。 即使在单独的XML文件中,它们也必须具有不同的ID。

例如,您可以将其声明更改为...

<EditText
android:id="@+id/edit_text1"

<EditText
android:id="@+id/edit_text2"

我知道这是一个古老的问题,但是我遇到了一个非常相似的问题,尽管当前答案是正确的(它是重复的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。

  相关解决方案