3

私は最初のアプリを構築しており、ほぼ完了しています。(イェーイ!) あとは、向きを変えたり、キーボードを引き出したりするときに使用する onConfigurationChange の Java をセットアップするだけです。まず問題は、setContentView メソッドによって新しい新しいレイアウトが配置されるため、向きが変わるとすべてが消去されることです。これはもちろん理にかなっていますが、方向/キーボードが変更されたときに edittext と textview の値を一定に保つことができる方法または可能な回避策があるかどうか疑問に思っていました。setContentView の前に文字列値を取得するなど、さまざまなことを試しましたが、これは NullPointerException になるだけであることがわかりました。

基本的に、私は edittext と textview の値を向きや変更内容と同じように維持しようとしています。

参照用に私のコードの簡単な要約を次に示します

これは実際のコードではなく、私がやっていることの要約です。

    public class MainActivity extends Activity {

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

     //do some stuff that is the core of the app. Nothing that would impact this question though

    }

      public void onConfigurationChanged(Configuration newConfig) {
     super.onConfigurationChanged(newConfig);

     if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){

        setContentView(R.layout.landscape);
            // same code that was within the onCreate. Just doing stuff related to  my  app 

    }if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){

        setContentView(R.layout.main);
            // same code that was within the onCreate. Just doing stuff related to  my  app
    }
         }
    ' }

はい、私は自分の AndroidManifest ファイルに android:configChanges="orientation|keyboardHidden" を書きました。アプリは正常に動作します。テキスト ビューと編集テキストが更新されていません。ありがとう!

4

2 に答える 2

0

ただし、方向/キーボードが変更されたときに edittext と textview の値を一定に保つことができる方法または可能な回避策があるかどうか疑問に思っていました。

こうやって……いや。呼び出すsetContentView()と、すべてがデフォルトになるため、TextViews にはデフォルトのテキストなどが含まれます...あなたが言ったように、 を保存しStringsて再度設定しようとすることもできますが、これは面倒です。「Android推奨」の方法で処理し、 Handling Runtime Changesを使用できます。ただし、現在はすべて自分で処理していますが、変更setContentView()中に呼び出すことはありませんorientation

なぜこのようにしたのかを教えていただければ、より良い解決策を提供できるかもしれません。setContentView()しかし、このように何度も電話をかけることはお勧めしません

小さな例

@Override
    public void onConfigurationChanged(Configuration newConfig) {
      newConfig = Globals.getUserLanguage(this);
      super.onConfigurationChanged(newConfig);
      if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
      {
          btnSave = (Button) findViewById(R.id.lsSaveBtn);
          Button btnHide = (Button) findViewById(R.id.button1);
          btnHide.setVisibility(Button.GONE);
          btnSave.setVisibility(Button.VISIBLE);
    //    btnSave.setOnClickListener();
      }
      else
      {
          btnSave = (Button) findViewById(R.id.button1);    
          Button btnHide = (Button) findViewById(R.id.lsSaveBtn);
          btnHide.setVisibility(Button.GONE);
          btnSave.setVisibility(Button.VISIBLE);
      }
    }
于 2013-06-14T02:38:52.997 に答える
0

に値を保存できますsavedInstanceState

onSaveInstanceState()アクティビティが停止し始めると、アクティビティが状態を保存できるようにシステムが呼び出されます。

値を復元するには、使用できます

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); // Always call the superclass first

    // Check whether we're recreating a previously destroyed instance
    if (savedInstanceState != null) {
        // Restore value of members from saved state
        mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
        mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
    } else {
        // Probably initialize members with default values for a new instance
    }
    ...
}

また

public void onRestoreInstanceState(Bundle savedInstanceState) {
    // Always call the superclass so it can restore the view hierarchy
    super.onRestoreInstanceState(savedInstanceState);

    // Restore state members from saved instance
    mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
    mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}

layoutレイアウトをポートレイトとランドスケープのフォルダーに配置することもできるため、アプリで毎回アクティビティlayout-landを呼び出す必要はありません。setContentView()onConfigurationChanged()restart

リンク :アクティビティの再作成

于 2013-06-14T02:59:16.170 に答える