Android - 处理屏幕方向更改的对话框

Don*_*rty 10 android dialog null-pointer screen-orientation

我重写了onCreateDialog和onPrepareDialog方法或Dialog类.

我按照Reto Meier的专业Android应用程序开发书第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;
  }
}
Run Code Online (Sandbox Code Playgroud)

它工作正常,直到我尝试更改屏幕方向,当我这样做onPrepareDialog得到调用,但我得到所有变量的空指针异常.

即使我告诉我的活动忽略清单中的屏幕方向,错误仍然会发生.

所以我假设书中的例子遗漏了一些东西我是否需要覆盖另一种方法来保存我的变量或什么?

我现在添加了以下内容:


@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);

}
Run Code Online (Sandbox Code Playgroud)

但我仍然得到Null Pointer例外

sea*_*ges 4

我没有 Reto 的书,所以无法检查代码,但如果书中有错误,您可以在 Twitter 上轻松联系他进行讨论: http: //twitter.com/retomeier

请记住,如果屏幕方向发生变化,您的活动将被重新创建。这意味着您上次设置的任何非静态变量在新方向下重新创建活动后都将丢失。

我的猜测是您在这里遇到了 NullPointerException:

if(setting.getAddForPublicUserNames() == 1){
Run Code Online (Sandbox Code Playgroud)

如果是这样,很可能某些用户操作将“设置”变量更改为 null 以外的值 - 您需要确保在重新创建活动时再次设置该变量。

此处详细介绍了存储/检索方向之间的 Activity 状态的最标准方法:使用 Save Instance State 保存 Android Activity 状态