2013-09-30 50 views
0

我正在實現顯示項目列表的視圖,允許用戶通過拖放對它們進行排序。這工作正常,直到我試圖旋轉屏幕。然後將所有項目的文本更改爲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的文本會發生變化?而爲什麼第一次啓動應用程序時呢?

如何避免文本自動更改?

在此先感謝。

回答

0

重點是 - 每次用戶旋轉設備時都會重新創建任何活動。所以,你應該正確處理娛樂過程。有一種方法onSaveInstanceStateActivity,在該方法中,您可以存儲在Bundle中以及稍後在onCreate方法中使用的任何值(因爲存在Bundle類型的參數)。

這裏是一個小例子:

public class MainActivity extends Activity { 

private TextView test1; 
private TextView test2; 

private final String KEY_1 = "key_1"; 
private final String KEY_2 = "key_2"; 

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

    test1 = (TextView) findViewById(R.id.test1); 
    test2 = (TextView) findViewById(R.id.test2); 

    if (savedInstanceState != null) { 
     if (savedInstanceState.containsKey(KEY_1)) { 
      test1.setText(savedInstanceState.getString(KEY_1)); 
     } 
     if (savedInstanceState.containsKey(KEY_2)) { 
      test2.setText(savedInstanceState.getString(KEY_2)); 
     } 
    } 

    findViewById(R.id.button1).setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      if (Math.random() < 0.5) { 
       test1.append("1"); 
      } else { 
       test2.append("2"); 
      } 
     } 
    }); 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putString(KEY_1, test1.getText().toString()); 
    outState.putString(KEY_2, test2.getText().toString()); 
} 
} 

這解釋了爲什麼根是空的XML

<LinearLayout 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"> 

<TextView 
    android:id="@+id/test1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="text1" > 
</TextView> 

<TextView 
    android:id="@+id/test2" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="text2" > 
</TextView> 

<Button 
    android:id="@+id/button1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Button" /> 

</LinearLayout> 
+0

。但是我不明白如何在onSaveInstanceState中保存視圖的文本並將它們應用於onCreate應該可以幫助我,因爲問題在於onCreate之後視圖中的文本被覆蓋。 – jakun

+0

@jakun您必須使用Bundle中存儲的數據重新填充視圖容器,可能應該先清空它。因此,如果「Bundle」不爲空並且包含文本數據 - 請使用它來重新創建具有旋轉之前的狀態的TextView。否則,填充視圖就像它是應用程序的第一個開始。 –

+0

我在'super.onCreate(savedInstanceState);'後面直接添加了一個'if(savedInstanceState!= null)savedInstanceState.clear();',這真的解決了它。非常感謝!稍後將根據數據庫填充此列表。 – jakun

相關問題