EditText值已被替代版本

时间:2017-02-10 05:51:03

标签: android android-fragments

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

<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,点击提交我将这个片段替换为另一个片段但是当我回到这个片段时,在backpress上,第一个编辑框的值将被第二个编辑框取代。现在两者都有相同的值。

这就是我替换片段的方式。

FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.layout_fragment, fragment, tag);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commitAllowingStateLoss();
getSupportFragmentManager().executePendingTransactions();

3 个答案:

答案 0 :(得分:1)

您应该为EditText使用不同的ID。

假设在void loop() { if (Serial.available() > 0) { byte command = Serial.read(); if (command == 1) { Serial.println("Move Forward"); digitalWrite(ledPin, HIGH); motor_left.run(FORWARD); } else if (command == 2) { Serial.println("Stop"); digitalWrite(ledPin, LOW); motor_left.run(RELEASE); } else { //put your code to stop Motor } } } 中定义了EditText,在包含布局时,指定不同的id。

edit_text_layout.xml

fragment_layout.xml

说明: Android在SparseArray中保存视图的状态,关键是视图的ID。恢复状态时,视图具有相同的id将获得相同的状态值。 如果视图没有ID(<include layout="@layout/edit_text_layout" android:id="@+id/edit_text_1" /> <include layout="@layout/edit_text_layout" android:id="@+id/edit_text_2" /> ),则其状态不会被保存或恢复。

NO_ID

android.view.View.java

答案 1 :(得分:1)

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

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

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 :(得分:0)

我知道这是一个老问题,但是我遇到了一个非常相似的问题,尽管当前答案是正确的(它是重复的ID问题),但给出的实际答案在正确的地方还是行不通的。

我有一个Fragment,在那个Fragment中,我有2个自定义控件,它们都具有唯一的ID,但是在这些控件内部,它们包含相同的通用Layout,因此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。