我处于这种情况,我在一个片段中有两个编辑文本,在背面按下第一个编辑文本的值被第二个编辑文本替换。现在两个编辑文本都具有相同的值。
<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();
答案 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。