2013-01-24 9 views
5

Ho un'attività che mostra ProgressDialog durante la connessione al dispositivo bluetooth. Funziona bene fino a quando l'orientamento dello schermo cambia mentre ProgressDialog è attivo. ProgressDialog scompare e quando viene stabilita la connessione, l'app chiama progressDialog.dismiss(); a questo punto l'app si arresta in modo anomalo perché non c'è ProgressDialog da eliminare. Come posso impedire a ProgressDialog di ignorare mentre l'orientamento dello schermo cambia?Come impedire a ProgressDialog di ignorare il cambio di rotazione dello schermo in Android?

public void prepareViews(int ID, boolean state){ 
     switch(ID){ 
     case USERNAME_TEXTBOX: 
      LoginUsernameTextBox.setEnabled(state); 
      break; 
     case PASSWORD_TEXTBOX: 
      LoginPasswordTextBox.setEnabled(state); 
      break; 
     case LOGIN_BUTTON: 
      LoginButton.setEnabled(state); 
      break; 
     case LOGIN_PROGRESSBAR: 
      if(state == true){ 
       LoginProgressBar.setVisibility(View.VISIBLE); 
       LoginProgressBar.setIndeterminate(true); } 
      else{ 
       LoginProgressBar.setVisibility(View.GONE); 
      } 
      break; 
     case CONNECTING_DIALOG: 
      if(state == true){ 
      progressDialog = ProgressDialog.show(MainActivity.this, "", "Connecting", true); } 
      else{ 
       progressDialog.dismiss(); 
      } 
      break; 
     } 
    } 

risposta

2

Finisco per utilizzare DialogFragment e funziona.

public class MainActivity extends Activity{ 



    public void prepareViews(int ID, boolean state){ 
     switch(ID){ 
     case USERNAME_TEXTBOX: 
      LoginUsernameTextBox.setEnabled(state); 
      break; 
     case PASSWORD_TEXTBOX: 
      LoginPasswordTextBox.setEnabled(state); 
      break; 
     case LOGIN_BUTTON: 
      LoginButton.setEnabled(state); 
      break; 
     case LOGIN_PROGRESSBAR: 
      if(state == true){ 
       LoginProgressBar.setVisibility(View.VISIBLE); 
       LoginProgressBar.setIndeterminate(true); } 
      else{ 
       LoginProgressBar.setVisibility(View.GONE); 
      } 
      break; 
     case CONNECTING_DIALOG: 
      if(state == true){ 
       showDialog(); 
      } 
      break; 
     } 
    } 

public void showDialog() { 
     FragmentManager fragmentManager = getFragmentManager(); 
     ProgressDialogFragment newFragment = new ProgressDialogFragment(); 
     newFragment.show(fragmentManager, "Dialog"); 
    } 

public static class ProgressDialogFragment extends DialogFragment { 
     @Override 
     public Dialog onCreateDialog(Bundle savedInstanceState) { 
      final ProgressDialog progressDialog = ProgressDialog.show(getActivity(), "", "Connecting to " 
        + DeviceName.subSequence(0, DeviceName.length() - 17)); 
      return progressDialog; 
     } 
    } 
} 
+0

Idealmente, per nasconderlo dovresti chiamare i metodi sul frammento della finestra di dialogo invece che su 'progressDialog' per mantenere l'implementazione del frammento di dialogo separato dall'attività. Cioè nel caso in cui si desideri modificare il modo in cui il frammento di dialogo visualizza le informazioni senza dover modificare anche l'attività. – frozenkoi

0

È necessario gestire personalmente il cambio di orientamento per farlo. Nel tuo manifest, per tutte le attività che vuoi fare, aggiungi Android: coinfigChange = "orientation". Ciò impedirà al sistema di distruggere e ricreare la tua app a rotazione e chiamerà invece la funzione onConfigChange della tua attività.

1

Prova questo.

if (progressDialog.isShowing()) { 
        progressDialog.dismiss(); 
       } 

ecco il link android Docs

0

Hai bisogno di sovraccaricare e aggiungere il android:coinfigChange="orientation" all'attività nel vostro manifesto.

Se è necessario gestire il layout senso di rotazione è necessario fare un po 'simile al seguente

@Override 
public void onConfigurationChanged(Configuration newConfig){ 

    if(!isConnection){  
     super.onConfigurationChanged(newConfig); 
     setContentView(R.layout.main); 
    }   
} 

si potrebbe anche ricostruire la finestra di avanzamento dopo aver chiamato setContentView() se si desidera gestire la rotazione del tutto.

7

Ricorda che Android distrugge e ricrea attività quando ruoti il ​​dispositivo. È probabile che il tuo problema sia che progressDialog è null perché dopo che l'attività è stata ricreata quella variabile non è stata nuovamente impostata.

È necessario utilizzare un DialogFragment e tenere presente lo activity lifecycle. Quello che devi fare è tenere traccia di se la finestra di dialogo è stata mostrata e visualizzarla di nuovo in OnCreate usando un DialogFragment.

Precedentemente è stato eseguito con Activity.dismissDialog e Activity.showDialog ma ora sono deprecati.

Altre informazioni: using dialog fragments.

+0

Grazie per la risposta! – user1888162

Problemi correlati