2012-01-14 17 views
1

Androidに新しくなったので、私は小さなプログラムを書いて、どのように動作するかに精通しています。 これまでに頭痛を与えてきたことは、画面回転と組み合わせて実行時に作成されたビューです。画面の回転を横切ってビューを維持する

小包を使用しようとすることが少ししかなかったので、回転後にビューを再作成するだけで問題を解決しました。

プログラムは、入力したテキストをTextViewとして、EditTextの下にあるTableLayoutに追加します。

これを解決する良い方法はありますか?私はこれを行うための方法の "out of the box"を見つけることができませんでした。

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()'を使用してアクティビティインスタンス間で*データ*を移動できます。特に、onSaveInstanceState()は、設定変更以外のシナリオでも役に立ちます。これらのアプローチの1つを使用してください。 – CommonsWare

+0

@CommonsWare:あなたのコメントを回答として投稿できますか? – seeker

+0

@Knabber:これをただ受け入れてください。彼の答えは正しい - 私は単に明らかにした。 – CommonsWare

-1

あなたは活動のためのmanifest.xmlとonConfigurationChanged実装に

 android:configChanges="orientation" 

を置くことによって活動のリロードを停止することができます。

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

レイアウトが同じ場合は、何もする必要はありません。

+0

おかげで、魔法のように動作します。 – seeker

+0

@Knabber:実際、この解決策はうんざりです。まず、間違っています。あなたの 'android:configChanges'リスト(少なくとも' keyboardHidden')にもっと値が必要です。第2に、 'android:configChanges'で*すべての可能な設定変更を列挙しない限り、この方法は、デバイスをドックに入れているような、他のすべての設定変更で失敗します。第3に、これは、今日実装しているリソースや今後追加するすべてのリソースを含め、関連するすべての設定変更で*使用しているすべてのリソースを手動でリロードする必要があることを意味します。 – CommonsWare

関連する問題