我正在实现一个显示项目列表的视图,允许用户通过拖放对它们进行排序。在我尝试旋转屏幕之前,这一直很好。然后将所有项目的文本更改为 onStart 和 onResume 之间(或在 super.onResume 中)的最后一项的文本。
我已将代码简化为以下内容,但仍会产生这种奇怪的行为:
public class MainActivity extends Activity {
LinearLayout root;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
System.out.println(" ### on create ### ");
if (root!=null) {
return;
}
System.out.println(" !!! root is null !!!");
root = new LinearLayout(this);
root.setOrientation(LinearLayout.VERTICAL);
for (int id=0; id<6; id++) {
View out = getLayoutInflater().inflate(R.layout.list_item, null);
TextView tv = (TextView) out.findViewById(R.id.list_item_text);
//TextView tv = (TextView) ((LinearLayout)out).getChildAt(1); // for this special list_item layout this line is equivalent to the above
tv.setText("test item "+id);
System.out.println(tv.getText());
root.addView(out);
}
setContentView(root);
}
@Override
protected void onStart() {
super.onStart();
System.out.println("on start");
System.out.println(((TextView) root.getChildAt(1).findViewById(R.id.list_item_text)).getText());
}
@Override
protected void onResume() {
super.onResume();
System.out.println("on resume");
System.out.println(((TextView) root.getChildAt(1).findViewById(R.id.list_item_text)).getText());
}
}
布局/list_item.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:gravity="center_vertical" >
<FrameLayout
android:id="@+id/list_item_knob"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_margin="20dp"
android:background="#FFD0A0" />
<TextView
android:id="@+id/list_item_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textIsSelectable="true" />
</LinearLayout>
在尝试时,我发现在 xml 布局文件中删除 TextView 的 id 时,文本不再更改(这当然需要找到另一种方法来在 java 代码中获取 TextView)。然后它可以工作,但这不可接受,因为我希望能够使用任意 xml 布局,其中 TextView 不需要是 LinearLayout 的子 1。
日志显示文本的更改发生在 onStart 和 onResume 之间(或在 super.onResume 中)。此外,在旋转屏幕后调用 onCreate 时,属性 root 始终为空。
为什么旋转屏幕时所有具有相同id的TextView的文本会发生变化?为什么第一次启动应用程序时没有?
如何避免文本自动更改?
提前致谢。