Android - Контакт с Диалоговым окном на Экранном изменении Ориентации

Я переопределяю onCreateDialog и onPrepareDialog методы или Диалоговый класс.

Я последовал примеру от Профессионала 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);

}

Но я все еще получаю Исключение нулевого указателя

10
задан Donal Rafferty 10 June 2010 в 12:00
поделиться

2 ответа

У меня нет книги Рето, поэтому я не могу проверить код, но если в книге есть ошибка, вы можете легко связаться с ним в Twitter, чтобы обсудить это: http://twitter.com/retomeier

Помните, что при изменении ориентации экрана ваша активность создается заново. Это означает, что все переменные, которые вы установили в прошлый раз и которые не являются статичными, будут потеряны после воссоздания активности под новой ориентацией.

Я предполагаю, что вы столкнулись с NullPointerException:

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

Если это так, то, скорее всего, какое-то действие пользователя изменило переменную "setting" на что-то отличное от null - вам нужно убедиться, что она снова установлена при повторном создании активности.

Наиболее стандартный метод сохранения/получения состояния активности между ориентациями подробно описан здесь: Saving Android Activity state using Save Instance State

4
ответ дан 4 December 2019 в 03:15
поделиться

Когда вы меняете ориентацию, Android перезапускает вашу активность, вам нужно сохранить состояние с помощью

onSaveInstanceState

и восстановить с помощью

savedInstanceState
2
ответ дан 4 December 2019 в 03:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: