10

onCreateDialog および onPrepareDialog メソッドまたは Dialog クラスをオーバーライドしています。

Reto Meier の Professional Android Application Development book の第 5 章の例に従って、いくつかの XML データを取得し、ダイアログを使用して情報を表示しました。

私は基本的にそれに従っていますが、変数を次のように自分の XML スキーマに合わせて変更しました。


@Override
public Dialog onCreateDialog(int id) {
  switch(id) {
    case (SETTINGS_DIALOG) :        
      LayoutInflater li = LayoutInflater.from(this);
      View settingsDetailsView = li.inflate(R.layout.details, null);

      AlertDialog.Builder settingsDialog = new AlertDialog.Builder(this);
      settingsDialog.setTitle("Provisioned Settings");         
      settingsDialog.setView(settingsDetailsView);
return settingsDialog.create();
  }
  return null;
}

@Override
public void onPrepareDialog(int id, Dialog dialog) {
  switch(id) {
    case (SETTINGS_DIALOG) :                  

String afpunText = "  ";

     if(setting.getAddForPublicUserNames() == 1){
      afpunText = "Yes";
     }
     else{
      afpunText = "No";
     }
      String Text = "Login Settings: " + "\n" 
                       + "Password: " + setting.getPassword()  + "\n" 
                       + "Server: " + setting.getServerAddress() + "\n";


      AlertDialog settingsDialog = (AlertDialog)dialog; 
settingsDialog.setTitle(setting.getUserName());

tv = (TextView)settingsDialog.findViewById(R.id.detailsTextView);
if (tv != null)
        tv.setText(Text);

      break;
  }
}

画面の向きを変更しようとするまで問題なく動作します。これを行うと、onPrepareDialog が呼び出されますが、すべての変数で null ポインター例外が発生します。

マニフェストで画面の向きを無視するようにアクティビティに指示しても、エラーは引き続き発生します。

したがって、本の例から何かが除外されていると思いますが、変数を保存するために別のメソッドをオーバーライドする必要がありますか?

以下を追加しました。


@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
  // Save UI state changes to the savedInstanceState.
  // This bundle will be passed to onCreate if the process is
  // killed and restarted.
  savedInstanceState.putString("Username", setting.getUserName());
  savedInstanceState.putString("Password", setting.getPassword());
  savedInstanceState.putString("Server", setting.getServerAddress());

  super.onSaveInstanceState(savedInstanceState);
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
  super.onRestoreInstanceState(savedInstanceState);
  settings.clear();
  // Restore UI state from the savedInstanceState.
  // This bundle has also been passed to onCreate.
  username = savedInstanceState.getString("Username");
  password = savedInstanceState.getString("Password");
  serveraddress = savedInstanceState.getString("Server");


Settings setting = new Settings(username, password, serveraddress);
addNewSettings(setting);

}

しかし、まだ Null Pointer 例外が発生しています

4

3 に答える 3

4

私はレトの本を持っていないので、コードを確認することはできませんが、本に誤りがあれば、Twitter で簡単に連絡して議論することができます: http://twitter.com/retomeier

画面の向きが変わると、アクティビティが再作成されることに注意してください。つまり、最後に設定した静的ではない変数は、アクティビティが新しい向きで再作成された後に失われます。

私の推測では、ここで NullPointerException にヒットしたと思います。

if(setting.getAddForPublicUserNames() == 1){

その場合、何らかのユーザー アクションによって "setting" 変数が null 以外に変更される可能性が高くなります。アクティビティが再作成されたときに、これが再度設定されていることを確認する必要があります。

オリエンテーション間のアクティビティ状態を保存/取得する最も標準的な方法については、ここで詳しく説明します: Save Instance State を使用して Android アクティビティ状態を保存する

于 2010-06-10T10:42:23.877 に答える
2

あなたが向きを変えるとき、アンドロイドはあなたの活動を再開します、あなたは財産を保存する必要があります

onSaveInstanceState

で回復します

savedInstanceState
于 2010-06-10T10:39:03.083 に答える
0

向きが変わったときにアクティビティを再作成したくない場合。AndroidManifest.xml に次の行を挿入します。

android:configChanges="keyboardHidden|orientation

例:

<activity android:name=".FABSLogin" android:label="@string/app_name" android:theme="@style/Theme.NoWindowTitle" android:noHistory="true" **android:configChanges="keyboardHidden|orientation**"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>

于 2010-09-04T12:07:58.240 に答える