2010-06-10 8 views
10

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

Odpowiedz

4

nie mam książkę Reto, tak nie mogę sprawdzić kod, ale jeśli jest to błąd w książce można łatwo skontaktować się z nim na Twitterze, aby to omówić: http://twitter.com/retomeier

Pamiętaj, że jeśli zmieni się orientacja ekranu, twoja aktywność zostanie odtworzona. Oznacza to, że wszelkie zmienne, które ustawiłeś jako ostatnie, które nie są statyczne, zostaną utracone po odtworzeniu działania w nowej orientacji.

Domyślam się, że trafisz NullPointerException tutaj:

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

Jeśli tak, to jest bardzo prawdopodobne, że niektóre działania użytkownik zmieni zmienną „Ustawienia” na coś innego niż null - trzeba upewnić się, że jest ponownie ustawiany po odtworzeniu działania.

Najbardziej standardowa metoda do przechowywania/pobierania stan aktywności między kierunkami jest szczegółowo tutaj: Saving Android Activity state using Save Instance State

+0

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) { –

+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

+0

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 :( –

2

Po zmianie orientacji, Android uruchom ponownie aktywności, trzeba aby zaoszczędzić na nieruchomości z

onSaveInstanceState 

i odzyskać z

savedInstanceState 
0

Jeśli nie chcą aktywności zostać odtworzone w przypadku zmiany orientacji. Wstaw następujący wiersz do pliku AndroidManifest.xml.

android:configChanges="keyboardHidden|orientation 

przykład:

<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

Dla mnie ta odpowiedź była najszybszym sposobem naprawienia wszystkich błędów związanych ze zmianą orientacji ekranu. mnie podczas integracji okien dialogowych na Facebooku! Użytkownik nadal może korzystać z klawiatury sprzętowej – OneWorld

+10

Może "wydawać się" działać, ale tylko ukrywa problem. – rf43

Powiązane problemy