6

Bluetoothデバイスに接続しているときにProgressDialogを表示するアクティビティがあります。ProgressDialogが起動しているときに画面の向きが変わるまでは正常に機能します。ProgressDialogが消え、接続が確立された後、アプリはprogressDialog.dismiss()を呼び出します。この時点で、却下するProgressDialogがないため、アプリがクラッシュします。画面の向きが変わっているときに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;
        }
    }
4

5 に答える 5

8

デバイスを回転させると、Androidはアクティビティを破棄して再作成することに注意してください。問題は、アクティビティが再作成された後、その変数が再度設定されなかったことprogressDialogが原因である可能性があります。null

DialogFragmentを使用し、アクティビティのライフサイクルを覚えておく必要があります。ダイアログが表示されたかどうかを追跡し、DialogFragmentを使用してOnCreateで再度表示する必要があります。

以前はActivity.dismissDialogActivity.showDialogで実行されていましたが、現在は非推奨になっています。

詳細:ダイアログフラグメントの使用

于 2013-01-24T20:27:43.583 に答える
3

私は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;
        }
    }
}
于 2013-01-26T16:30:56.257 に答える
1

これを試して。

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

ここにリンクアンドロイドドキュメントがあります

于 2013-01-24T20:23:15.803 に答える
0

マニフェストのアクティビティにオーバーロードonConfigurationChanged()して追加する必要があります。android:coinfigChange="orientation"

回転レイアウトを賢く処理する必要がある場合は、次のようなことを行う必要があります

@Override
public void onConfigurationChanged(Configuration newConfig){

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

回転を完全に処理したい場合は、setContentView()を呼び出した後に進行状況ダイアログを再構築することもできます。

于 2013-01-24T20:25:57.840 に答える
0

これを行うには、向きの変更を自分で処理する必要があります。マニフェストで、これを実行するすべてのアクティビティに対して、android:coinfigChange="orientation"を追加します。これにより、システムがローテーション時にアプリを破棄して再作成するのを防ぎ、代わりにアクティビティのonConfigChange関数を呼び出します。

于 2013-01-24T20:21:05.907 に答える