web-dev-qa-db-ja.com

Android-横長モードと縦長モードを切り替えると、Intentが値を失う

Androidアプリでアクティビティを切り替えるためにインテントを使用しています。次のアクティビティで使用するためにデータをインテントに入れています。スマートフォンを横向きモードと縦向きモードに切り替えると、渡された値インテントから失われ、NullPointerExceptionが発生します。

誰かが間違っている可能性があることを教えてください。

完全に投稿するためのコードはたくさんあります。しかし、誰かがコードの特定の部分を調べる必要がある場合は、ここに投稿できます。

編集
状態が保存されない問題を解決しました。しかし、私が直面した別の問題は、向きが変更された後、画面上のボタンがどれも機能しないことです。ボタンを押すと、LogCatにこの警告が表示されます

02-25 23:07:49.190: WARN/WindowManager(58): No window to dispatch pointer action 0

助けてください。

20
lostInTransit

方向を切り替えると、アクティビティが再作成され、onCreateが呼び出されるため、バンドルを使用して現在の状態を保存し、方向を変更した後に復元する必要があります。 TextViewを備えたアプリだけがあり、テキストを入力して向きを変更した場合、この動作を確認できます。 onCreateに状態をバンドルすると、これを抑制することができます。これはおそらく、向きが変わった後にNullPointerを使用する理由でもあります。それは地獄のように煩わしいですが、私たちと一緒に暮らす必要があります。

This 一連のオリエンテーションチュートリアルへのリンク、特に this first one は、何が起こっているのか、現在の状態を正常に維持する方法を正確に理解するのに役立ちます。

更新:SO Activity restart on rotation Android に関する投稿もあり、ほぼ同じことを扱います。

フォローアップ質問の編集:

向きを変更した後、クリックハンドラーを再接続しましたか?

25

これをマニフェストファイルに書き込みます。

 Android:configChanges="orientation|keyboardHidden"

編集:新しいAPIバージョンにこれを使用します-

Android:configChanges="orientation|keyboardHidden|screenSize"

間違いなく動作します。

9
Hulk

これを試して:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putString(SOME_KEY, "blah blah blah");
}

@Override
public void onCreate(Bundle savedInstanceState) {
   ...
   somevalue = savedInstanceState.getString(SOME_KEY);
   ...
}
5
Hidayath

「orientation」の値を使用して属性Android:configChangesを宣言することが可能です。これにより、アクティビティが再開されなくなります。代わりに、アクティビティは実行されたままで、onConfigurationChanged()メソッドが呼び出されます。

3
Nadav Daniel

宣言< Android:configChanges="orientation|keyboardHidden"/>マニフェスト内。これにより、方向/キーボードの可視性の変更を自分で管理できます。もちろん、それを管理するためにコールバックメソッドをオーバーライドする必要はありません。

1

こんにちは私もこの問題に遭遇しました。私のためにそれを修正したのは:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state
    savedInstanceState.putString("Username", mUsername);
    savedInstanceState.putString("Password", mPassword);
    savedInstanceState.putString("UserID", mUserID);

    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}

そしてonCreate()で:

if (savedInstanceState == null) {
    Bundle extras = getIntent().getExtras();
    if(extras == null) {
        mUsername = "?";
        mPassword = "?";
        mUserID = "?";
    } else {
        mUsername = extras.getString("Username");
        mPassword = extras.getString("Password");
        mUserID = extras.getString("UserID");
    }
} else {
    mUsername = (String) savedInstanceState.getSerializable("Username");
    mPassword = (String) savedInstanceState.getSerializable("Password");
    mUserID = (String) savedInstanceState.getSerializable("UserID");
}

次に、オブジェクトがnullでないことを確認できます。

0
Noyloy