2013-01-24 1 views
5

블루투스 장치에 연결하는 동안 ProgressDialog를 보여주는 활동이 있습니다. ProgressDialog가 작동하는 동안 화면 방향이 변경 될 때까지 제대로 작동합니다. ProgressDialog가 사라지고 연결이 설정되면 앱에서 progressDialog.dismiss()를 호출합니다. 이 시점에서 앱을 종료 할 ProgressDialog가 없기 때문에 앱이 다운됩니다. 화면 방향이 변경되는 동안 ProgressDialog가 닫히지 않게하려면 어떻게합니까? 이렇게 당신은 방향을 처리해야Android에서 화면 회전 변화시 ProgressDialog를 닫지 못하도록 방지하는 방법은 무엇입니까?

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:coinfigChange="orientation"를 추가 할 필요가 android Docs

0

입니다.

당신이 회전 레이아웃을 처리해야하는 경우

은 현명한 당신은 당신이 된 setContentView를 (전화 후 완전히 회전을 처리하려는 경우 다음

@Override 
public void onConfigurationChanged(Configuration newConfig){ 

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

같은 일부 당신도) 진행 대화 상자를 다시 할 수 할 필요가있다.

7

Android는 기기를 회전 할 때 활동을 파괴하고 다시 만듭니다. 활동이 다시 작성된 후에 해당 변수가 다시 설정되지 않았으므로 progressDialognull 인 문제점이있을 수 있습니다.

DialogFragment을 사용해야하고 activity lifecycle을 염두에 두어야합니다. 대화 상자가 표시되었는지 여부를 추적하고 DialogFragment를 사용하여 OnCreate에 다시 표시해야합니다.

이전에는 Activity.dismissDialogActivity.showDialog으로 완료되었지만 이제는 더 이상 사용되지 않습니다.

자세한 정보 : using dialog fragments.

+0

답변 해 주셔서 감사합니다. – user1888162

관련 문제