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

问题描述:

我重写onCreateDialog和onPrepareDialog方法或Dialog类。Android - 在屏幕上处理对话框方向更改

我遵循了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); 

} 

但我仍然得到空指针异常

我没有雷托的书收回,所以我不能检查代码,但如果书中有误,您可以轻松地与他联系在Twitter上讨论这个问题:http://twitter.com/retomeier

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

我的猜测是,你打这儿一个NullPointerException:

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

如果是这样,这是最有可能某些用户行为改变“设置”变量为null之外的东西 - 你需要确保这个在活动重新创建时再次设置。

最标准的方法来存储/检索方向之间的活动状态在这里详细描述:Saving Android Activity state using Save Instance State

+0

嗨seanhodges,我跟着你提供的堆栈溢出例如本例中,我已经加了我新的代码,以我的问题,但我仍然在得到空指针你提到的确切的线 - 如果(setting.getAddForPublicUserNames()== 1){ – 2010-06-10 11:11:06

+1

嗯,我希望它现在可以工作。尝试在onRestoreInstanceState()方法中插入一个断点,并确保在onPrepareDialog()方法尝试使用它之前确实设置了“setting”...... – seanhodges 2010-06-10 11:18:57

+0

看来我的设置对象是空指针的原因,它不能被创建/保存或什么?我将所有变量都更改为类中,并取消了设置对象的使用,现在应用程序运行良好。问晚上剩下的时间搞清楚为什么我的对象没有被保存/创建:( – 2010-06-10 11:59:36

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

onSaveInstanceState 

savedInstanceState 

如果你不想让活动进行方向改变时重新创建。在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>

+0

对我来说,这个答案是修复与屏幕方向改变有关的所有bug的最快方法。我同时集成了Facebook对话框!用户仍然可以使用硬件键盘 – OneWorld 2010-12-08 12:50:09

+10

它似乎可以工作,但只能隐藏问题。 – rf43 2011-10-13 01:04:37