Android – 处理屏幕方向改变的对话框

我重写onCreateDialog和onPrepareDialog方法或Dialog类。

我遵循了Reto Meier的“专业Android应用程序开发”一书第5章中的例子来拉取一些XML数据,然后使用对话框来显示信息。

我已经基本上遵循它,但改变了variables,以适应​​我自己的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获取调用,但我得到所有我的variables空指针exception。

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

所以我认为,书中的例子已经被遗漏了,我需要重写另一种方法来保存我的variables或什么?

我现在增加了以下内容:


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

但是我仍然得到空指针exception

Solutions Collecting From Web of "Android – 处理屏幕方向改变的对话框"

我没有Reto的书,所以我不能检查代码,但如果在书中有一个错误,你可以在Twitter上轻松地与他联系,讨论它: http : //twitter.com/retomeier

请记住,如果屏幕方向改变,你的活动重新创build。 这意味着,在新的方向下重新创build活动后,您最后一次设置的非静态variables将会丢失。

我的猜测是你在这里遇到了一个N​​ullPointerException:

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

如果是这样,那么很可能某些用户操作会将“设置”variables更改为非空值 – 您需要确保在重新创build活动时再次设置该值。

存储/检索方向之间活动状态的最标准方法在此处详述: 使用“保存实例状态”保存Android活动状态

当你改变方向,android重新启动你的活动,你需要保存的遗产

 onSaveInstanceState 

和恢复

 savedInstanceState 

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