我有一个LinearLayout,其中我从xml文件中膨胀了几个CheckBox。他们按预期工作;然而,当屏幕旋转(因此活动被破坏/重新创建)时,会发生一个奇怪的错误。假设有6个复选框,它们有文本“一”,“两个”等通过“六”。轮换后,其中所有六个都将读为“六”。无论我尝试什么,这都会持续存在,直到我运行一个自定义函数,该函数可以添加或删除其中一个复选框,此时剩余的函数会再次以正确的顺序显示正确的文本。
这是复选框的XML:
<?xml version="1.0" encoding="utf-8"?>
<CheckBox xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/groupcreate_entry"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:button="@null"
android:drawableRight="?android:attr/listChoiceIndicatorMultiple"
//The above two lines allow the checkbox to be to the right of the text.
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="right" />
有问题的代码:
protected void onCreate(Bundle savedInstanceState) {
private ArrayList<String> groupNames = new ArrayList<String>(10);
super.onCreate(savedInstanceState);
setContentView(R.layout.groupcreate);
LinearLayout groupCreate = (LinearLayout) findViewById(R.id.groupCreate);
setupGroupViews();
}
private void setupGroupViews() {
groupCreate.removeAllViews();
CheckBox[] textBox = new CheckBox[groupNames.size()];
//I originally reused the same CheckBox each time, but switched to an
//array to try debugging this issue; no luck
for (int i = 0; i < groupNames.size(); i++) {
textBox[i] = (CheckBox) (getLayoutInflater().inflate(R.layout.groupcreate_entry, groupCreate, false));
textBox[i].setText(groupNames.get(i));
registerForContextMenu(textBox[i]);
groupCreate.addView(textBox[i]);
}
}
在我添加或删除复选框的函数中,除了在ArrayList groupNames中添加/删除它并重新运行setupGroupViews之外,我做的不多。
我尝试在onCreate()中运行groupCreate.invalidate()无效。我猜测它与正在重绘的活动有关,但我尝试了很多东西而无法弄清楚它是什么。是因为我使用相同的布局文件给每个CheckBox充气吗?这就是为什么用最后创建的CheckBox的相同文本重新绘制它们的原因?
走向我的智慧结束;任何和所有的输入赞赏。很高兴澄清是否有任何需要它。
编辑:我创建的另一个功能允许您通过右键单击上下文菜单编辑复选框的文本,这会弹出一个对话框。如果你去编辑第一个复选框的文本,在这个例子中 应该有'one'的文本,而是读'six',对话框通过getText()拉出复选框的文本.toString(),它确实显示了'six'的错误文本。但是,无论您对对话框中的文本进行了哪些修改,一旦您点击确定并提交更改,所有复选框都会返回正确的文本,并且它将再次显示为“一”。
我想知道它是否以某种方式继续引用已删除的CheckBox视图,但如果是这样,我不知道为什么我在继续之前调用groupCreate.removeAllViews()。
答案 0 :(得分:2)
我认为您遇到的问题是由于您的所有CheckBox
个实例都使用相同的ID groupcreate_entry
。
Android恢复根据对象ID查看数据,因此在保存时,它会拉动项目ID并保存其各自的值。在恢复时,它会查看每个元素,并为其提供为该ID保存的值(“6”,为groupcreate_entry
保存的最后一个值)。
解决方案:尝试为对象提供自己独特的ID,然后应该修复它。当然,另一个选择是简单地覆盖默认行为。