2012-01-14 69 views
1

Android新手,所以我正在編寫小程序以熟悉事情的工作方式。 到目前爲止,讓我頭痛的是在運行時與屏幕旋轉結合創建的視圖。堅持屏幕旋轉的意見

嘗試使用包裹的小運氣之後,我通過在旋轉後重新創建視圖來解決問題。

程序會將輸入的文本作爲TextView添加到EditText下的TableLayout中。

有沒有更好的解決方法呢?我找不到任何「開箱即用」的方法。

public class MWEActivity extends Activity { 
    TableLayout table; 
    EditText txtInput; 
    ArrayList<String> savedEntry = new ArrayList<String>(); 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     table = (TableLayout)this.findViewById(R.id.table); 
     txtInput = (EditText)this.findViewById(R.id.txtInput); 

     txtInput.setOnEditorActionListener(new OnEditorActionListener() { 

      public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
       if(event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN){ 
         TextView newtext = new TextView(getApplicationContext()); 
         newtext.setText(txtInput.getText()); 
         savedEntry.add(newtext.getText().toString()); 
         table.addView(newtext); 
         txtInput.setText(""); 
         return true; 
       } 
       return false; 
      } 
     }); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     outState.putStringArrayList("entry", savedEntry); 
     super.onSaveInstanceState(outState); 
    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     if(savedInstanceState.getStringArrayList("entry") == null){ 
      savedEntry = new ArrayList<String>(); 
      savedEntry.add("Return was NULL"); 
     }else{ 
      savedEntry = savedInstanceState.getStringArrayList("entry"); 
     } 

     for(String s : savedEntry){ 
      TextView tv = new TextView(getApplicationContext()); 
      tv.setText(s); 
      table.addView(tv); 
     } 
     super.onRestoreInstanceState(savedInstanceState); 
    } 
} 

回答

2

要麼你不得不像以前的答案那樣禁用方向改變,要麼只是在標準設施上依靠 。它會暫停然後重新創建您的活動。沒有額外的代碼是必要的。您還可以針對不同的方向提供不同的佈局:

http://developer.android.com/guide/practices/screens_support.html

+0

@Knabber:如果你使用的是動態片段,你可以使用'setRetainInstance(true)'獲得android:configChanges'方法的很多好處,而不會帶來大部分伴隨風險。如果你不使用動態片段,你仍然可以使用'onSaveInstanceState()'和'onRetainNonConfigurationInstance()'在活動實例之間移動你的* data *。特別是'onSaveInstanceState()'也可以幫助你在其他情況下,超出配置更改。請使用這些方法之一。 – CommonsWare 2012-01-14 20:23:15

+0

@CommonsWare:你能否發表你的評論作爲答案? – seeker 2012-01-14 23:18:37

+0

@Knabber:接受這個。他的回答是正確的 - 我只是提供了澄清。 – CommonsWare 2012-01-14 23:52:37

-1

您可以通過將

 android:configChanges="orientation" 

在manifest.xml的活動和實施onConfigurationChanged停止活動的重新加載。

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
} 

如果你的佈局是一樣的,你不需要做任何事情。

+0

感謝,作品像一個魅力。 – seeker 2012-01-14 18:53:51

+0

@Knabber:其實,這個解決方案很糟糕。首先,這是錯誤的 - 你需要在android:configChanges列表中更多的值(至少'keyboardHidden')。其次,除非您在'android:configChanges'中列出了所有可能的配置更改,否則這種方法將無法執行所有其他配置更改,例如將設備置於擴展塢中。第三,這意味着您必須*手動*重新加載*您正在使用的每個*資源*每個*相關的配置更改,包括您今天實施的資源以及將來添加的所有資源。 – CommonsWare 2012-01-14 20:20:45