Android - Работа с диалогом на экране Изменение ориентации
Я переопределяю методы onCreateDialog и onPrepareDialog или класс Dialog.
Я воспользовался примером из книги по разработке приложений для Android Android Reto Meier Professional, глава 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;
}
}
Он работает нормально, пока я не попытаюсь изменить ориентацию экрана. Когда я это делаю, то на PrepareDialog появляется вызов, но я получаю исключения из 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
Ответы
Ответ 1
У меня нет книги Reto, поэтому я не могу проверить код, но если в книге есть ошибка, вы можете легко связаться с ним в Twitter, чтобы обсудить ее: http://twitter.com/retomeier
Помните, что если ориентация экрана меняется, ваша деятельность воссоздается. Это означает, что любые переменные, которые вы установили в последний раз, которые не являются статическими, будут потеряны после того, как активность будет воссоздана в соответствии с новой ориентацией.
Я предполагаю, что здесь вы выбрали исключение NullPointerException:
if(setting.getAddForPublicUserNames() == 1){
Если это так, то, скорее всего, какое-то действие пользователя изменяет переменную "setting" на что-то другое, кроме нулевого. Вам нужно убедиться, что это снова установлено при обновлении активности.
Самый стандартный способ хранения/получения состояния активности между ориентациями подробно описан здесь: Сохранение состояния активности Android с использованием состояния сохранения экземпляра
Ответ 2
Когда вы меняете ориентацию, андроид перезапускает вашу деятельность, вам нужно сохранить имущество с помощью
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>