Nadpisuję metody onCreateDialog i onPrepareDialog lub Dialog.Android - radzenie sobie z dialogiem na ekranie Zmiana orientacji ekranu
Podążyłem za przykładem z książki Professional Application Development firmy Reto Meier, rozdział 5, aby pobrać trochę danych XML, a następnie użyć okna dialogowego do wyświetlenia informacji.
mam w zasadzie po to dokładnie, ale zmienił zmienne w zależności mój własny schemat XML w następujący sposób:
@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;
}
}
To działa dobrze, dopóki I spróbuj zmienić orientację ekranu, gdy robię to naPrepareDialog dostaje wywołanie, ale dostaję wyjątki wskaźnik null na wszystkie moje zmienne.
Błąd nadal występuje, nawet gdy mówię, że moja aktywność ma ignorować orientację ekranu w manifeście.
Zakładam, że coś zostało pominięte w przykładzie w książce, czy muszę zastąpić inną metodę zapisywania zmiennych w czymś?
Mam teraz dodaje następujące:
@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);
}
ale nadal jestem coraz wyjątku Null Pointer
Hi seanhodges, że za przykładem na przykład przepełnienie stosu podałeś, dodałem mój nowy kod na moje pytanie, ale ja wciąż coraz Null wskaźnik na dokładnie taką linijkę, o której wspomniałeś - if (setting.getAddForPublicUserNames() == 1) { –
Hmm, oczekiwałbym, że teraz będzie działać. Spróbuj trzymać punkt przerwania w swojej metodzie onRestoreInstanceState() i upewnij się, że "ustawienie" jest faktycznie ustawiane, zanim metoda onPrepareDialog() spróbuje go użyć ... – seanhodges
Wygląda na to, że mój obiekt ustawień jest przyczyną wskaźników zerowych, Nie wolno jej tworzyć/zapisywać, czy coś w tym stylu? Zmieniłem wszystkie moje zmienne tak, aby znalazły się w klasie i usunąłem użycie obiektu ustawień, a teraz aplikacja działa poprawnie. Q reszta wieczoru zastanawia się, dlaczego mój obiekt nie jest zapisywany/tworzony :( –