2013-01-24 56 views
5

我有一個活動,顯示連接到藍牙設備時ProgressDialog。它工作正常,直到ProgressDialog啓動時屏幕方向改變。 ProgressDialog消失,當連接建立後,應用程序調用progressDialog.dismiss();在這一點上應用程序崩潰,因爲沒有ProgressDialog解僱。如何防止ProgressDialog在屏幕方向更改時解散?如何防止ProgressDialog在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; 
     } 
    } 

回答

2

我最終使用DialogFragment,它的工作原理。

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

理想情況下,爲了隱藏它,您應該調用對話框片段上的方法,而不是使用'progressDialog'來保持對話框片段的實現與活動分離。即如果您想更改對話框片段顯示信息的方式,則不必更改活動。 – frozenkoi

0

您必須自己處理方向更改才能執行此操作。在你的清單中,對於你想要做的所有活動,添加android:coinfigChange =「orientation」。這將阻止系統銷燬並重新創建您的應用程序,並將調用您的活動的onConfigChange函數。

1

試試這個。

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

這裏是鏈接android Docs

0

你需要重載並添加android:coinfigChange="orientation"到活動中您的清單。

如果您需要處理旋轉佈局明智的,你需要做一些像下面

@Override 
public void onConfigurationChanged(Configuration newConfig){ 

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

你也可以重建進度對話框調用的setContentView(之後),如果你想完全手柄轉動。

7

請記住,當您旋轉設備時,Android會銷燬並重新創建活動。您的問題可能是progressDialognull,因爲在重新創建活動之後,該變量未被再次設置。您需要使用DialogFragment並記住activity lifecycle。你需要做的是跟蹤是否顯示對話框,並使用DialogFragment在OnCreate中再次顯示。

以前它是用Activity.dismissDialogActivity.showDialog完成的,但現在已經廢棄了。

更多信息:using dialog fragments

+0

感謝您的回答! – user1888162