gpt4 book ai didi

android - 为什么自定义复合 View 中的 EditText 会重复使用在另一个复合 View 实例中输入的文本?

转载 作者:IT老高 更新时间:2023-10-28 23:13:10 26 4
gpt4 key购买 nike

我正在尝试编写由 TextViewEditText 组成的自定义复合 View ,_compound_view.xml_:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/compoundText"
android:layout_width="match_parent"
android:layout_height="wrap_content" >

<TextView
android:id="@+id/textLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Label" />

<EditText
android:id="@+id/textEdit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="enter text here" >
</EditText>

这是扩展LinearLayout的类:

public class CompoundView extends LinearLayout {

public CompoundView(Context context, AttributeSet attrs) {
super(context, attrs);

readAttributes(context, attrs);
init(context);
}

public CompoundView(Context context) {
super(context);

init(context);
}

private void init(Context c) {

final LayoutInflater inflater = (LayoutInflater) c
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.compound_view, this);

}
}

现在,如果我在我的 _activity_main.xml_ 中使用其中的 2 个 View:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<it.moondroid.compoundview.example.CompoundView
android:id="@+id/compoundview1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true" />

<it.moondroid.compoundview.example.CompoundView
android:id="@+id/compoundview2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/compoundview1" />
</RelativeLayout>

在 Activity 代码中,我只对 RelativeLayout 进行膨胀,而不管理 onSaveInstanceState:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

}

然后当我在第二个 EditText 中写一些东西并旋转我的设备时,相同的 text 出现在第一个自定义 View 的 EditText 中>.

为什么会发生这种行为?

编辑:

我通过删除 android:id 并为 Compound_view.xml 中的 EditText 使用 android:tag 解决了这个问题,然后管理保存CompoundView 类中的 EditText 状态:

@Override
protected Parcelable onSaveInstanceState() {

Bundle bundle = new Bundle();
bundle.putParcelable("instanceState", super.onSaveInstanceState());
bundle.putString("currentEdit", mEditText.getText().toString());
bundle.putBoolean("isFocused", mEditText.hasFocus());
return bundle;

}

@Override
protected void onRestoreInstanceState(Parcelable state) {

if (state instanceof Bundle) {
Bundle bundle = (Bundle) state;
mEditText.setText(bundle.getString("currentEdit"));
if (bundle.getBoolean("isFocused")) {
mEditText.requestFocus();
}
super.onRestoreInstanceState(bundle.getParcelable("instanceState"));
return;
}

super.onRestoreInstanceState(state);
}

最佳答案

您需要禁用 SaveEnabled使用 android:saveEnabled="false"

的 EditText 属性

在您的自定义 View 中,您正在从定义了 ID 的 XML 扩展布局。如果 View 定义了 ID,Android 操作系统具有保存和恢复 View 状态的默认功能。

表示当Activity暂停时会保存EditText的文本,当Activity恢复时会自动恢复。在您的情况下,您多次使用此自定义 View ,并且正在膨胀相同的布局,因此您的所有 EditText 都具有相同的 ID。现在,当 Activity 暂停时,Android 将检索 EditText 的值并保存它们的 ID,但由于每个 EditText 具有相同的 ID,值将被覆盖,因此它将在所有 EditText 中恢复相同的值。

关于android - 为什么自定义复合 View 中的 EditText 会重复使用在另一个复合 View 实例中输入的文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13914970/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com