我正在實現顯示項目列表的視圖,允許用戶通過拖放對它們進行排序。這工作正常,直到我試圖旋轉屏幕。然後將所有項目的文本更改爲onStart和onResume(或super.onResume)之間的最後一項的文本。具有相同ID的所有TextView的android文本在onStart和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的文本會發生變化?而爲什麼第一次啓動應用程序時呢?
如何避免文本自動更改?
在此先感謝。
。但是我不明白如何在onSaveInstanceState中保存視圖的文本並將它們應用於onCreate應該可以幫助我,因爲問題在於onCreate之後視圖中的文本被覆蓋。 – jakun
@jakun您必須使用Bundle中存儲的數據重新填充視圖容器,可能應該先清空它。因此,如果「Bundle」不爲空並且包含文本數據 - 請使用它來重新創建具有旋轉之前的狀態的TextView。否則,填充視圖就像它是應用程序的第一個開始。 –
我在'super.onCreate(savedInstanceState);'後面直接添加了一個'if(savedInstanceState!= null)savedInstanceState.clear();',這真的解決了它。非常感謝!稍後將根據數據庫填充此列表。 – jakun