【问题标题】:Android - Dealing with a Dialog on Screen Orientation changeAndroid - 处理屏幕方向更改上的对话框
【发布时间】:2011-03-02 02:36:51
【问题描述】:

我正在重写 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;
  }
}

在我尝试更改屏幕方向之前它工作正常,当我这样做时 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);

}

但我仍然收到空指针异常

【问题讨论】:

    标签: android dialog screen-orientation null-pointer


    【解决方案1】:

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

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

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

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

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

    此处详细介绍了存储/检索方向之间的活动状态的最标准方法:Saving Android Activity state using Save Instance State

    【讨论】:

    • 嗨,seanhodges,我按照您提供的堆栈溢出示例中的示例进行操作,我已将新代码添加到我的问题中,但我仍然在您提到的确切行上获得 Null 指针 - if(setting .getAddForPublicUserNames() == 1){
    • 嗯,我希望它现在可以工作。尝试在 onRestoreInstanceState() 方法中设置断点,并确保在 onPrepareDialog() 方法尝试使用它之前实际设置了“设置”...
    • 看来我的设置对象是空指针的原因,它不能被创建/保存或什么?我将所有变量都更改为在类中,并删除了设置对象的使用,应用程序现在运行良好。 Q 晚上剩下的时间弄清楚为什么我的对象没有被保存/创建:(
    • 您可能正在 Activity 的构造函数中执行“setting = new Setting()”(不会被第二次调用)。确保在 addNewSettings() 方法中添加了“this.setting = setting”。
    【解决方案2】:

    当你改变方向时,android重启你的activity,你需要保存属性

    onSaveInstanceState
    

    并用

    恢复
    savedInstanceState
    

    【讨论】:

      【解决方案3】:

      如果您不希望在方向更改时重新创建活动。在 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>

      【讨论】:

      • 对我来说,这个答案是修复所有与屏幕方向更改相关的错误的最快方法。这在集成 Facebook 对话框时帮助了我!用户仍然可以使用硬件键盘。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-17
      • 2011-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多