20

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

何が間違っているのか教えてください。

それを完全に投稿するには多くのコードがあります。しかし、誰かがコードの特定の部分を見る必要がある場合は、ここに投稿できます。

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

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

助けてください。

4

6 に答える 6

25

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

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

更新:ローテーション Androidでの SO アクティビティの再起動に関する投稿もあり、ほぼ同じことを扱っています。

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

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

于 2009-02-25T05:23:11.080 に答える
9

これをマニフェスト ファイルに書き込みます。どのアクティビティでこれが必要ですか?

 android:configChanges="orientation|keyboardHidden"

編集済み:新しい API バージョンにはこれを使用してください--

android:configChanges="orientation|keyboardHidden|screenSize"

必ず効きます..

于 2012-05-10T09:17:21.513 に答える
5

これを試して:

@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);
   ...
}
于 2009-07-13T09:33:21.877 に答える
3

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

于 2011-03-20T14:21:17.597 に答える
1

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

于 2012-10-22T06:03:03.073 に答える
0

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

@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 でないことを確認できます。

于 2015-10-29T17:24:02.793 に答える