3

各ページにはがありActivity、それぞれに(を使用して) を認識してページからデータをロードしますが、リクエストがエラーで終了した場合、タイムアウトを入力するか、接続が失われた場合は、ダイアログを表示する必要がありますサーバーへの呼び出しをやり直すオプションを使用すると、エラーごとに複数のダイアログが開かれるのを防ぐ問題は、次のスニペットで解決されます。ViewPager PagerSlidingTabStripViewPagerfragmentfragmenthttp requestVolley

ここでこのソリューションを参照してください: http://www.jorgecoca.com/android-quick-tip-avoid-opening-multiple-dialogs-when-tapping-an-element/

@Override
public void show(FragmentManager manager, String tag) {
    if (manager.findFragmentByTag(tag) == null) {
      super.show(manager, tag);
    }
}

ユーザーがクリックしdialog buttonて再試行すると、ダイアログが閉じられ、インターネット接続があるかどうかが確認されます。そうでない場合は、ダイアログを再度開く必要がありますが、ダイアログは再度表示されません。タグが表示されていると思いますにリリースされませんでしたFragmentManager

コードActivity:

final Button mButton = ( Button ) this.findViewById( R.id.btn_opendialog );

final DialogFragmentHelper mDialog = new DialogFragmentHelper();
mDialog.setCallbackListener( new OnCallback() {

    @Override
    public void onCancel() {

    }

    @Override
    public void onConfirm() {

        // verify if network available

        mDialog.show( MainActivity.this.getSupportFragmentManager(), DialogFragmentHelper.DIALOG_TAG );
    }
} );

mButton.setOnClickListener( new OnClickListener() {

    @Override
    public void onClick( final View v ) {

        mDialog.show( MainActivity.this.getSupportFragmentManager(), DialogFragmentHelper.DIALOG_TAG );
    }
} );

誰かが回避策を提案してくれますか?

4

2 に答える 2

2

私のプロジェクトで準備ができている構造を維持し、フラグを使用せず、管理する 3 番目のダイアログフラグメントの制御を渡すという目標に近づけるために、1 時間かかるソリューションに到達しました。結果。

DialogFragmentHelper mDialog = new DialogFragmentHelper();
mDialog.setCallbackListener( new OnCallback() {

    @Override
    public void onCancel() {}

    @Override
    public void onConfirm() {

        mDialog.dismissAllowingStateLoss();

        if(networkAvailable == false){

            new Handler().post( new Runnable() {

                @Override
                public void run() {
                    mDialog.show( MainActivity.this.getSupportFragmentManager(), DialogFragmentHelper.DIALOG_TAG );
                }
            } );

        }else {
            //do something here
        }
    }
} );

このようにして、ダイアログフラグメントを開くためにいくつかのリクエストが送信されている間、最初のリクエストのみが実行され、ダイアログフラグメントを閉じると、必要に応じてすぐに開くことができます。

于 2014-07-16T19:24:30.330 に答える
1

シングルトンコントローラーを使用してアプローチできます。例えば:

package com.example.stackoverflowsandbox;

public class MyDialogController {
    private static MyDialogController instance;

    public static MyDialogController getInstance() {
        if ( MyDialogController.instance == null ) {
            MyDialogController.instance = new MyDialogController();
        }

        return MyDialogController.instance;
    }

    private boolean dialogOpenned;

    private MyDialogController() {}

    public void closeDialog() {
        if ( this.dialogOpenned ) {
            this.dialogOpenned = false;

            // you close code...
        }
    }

    public void openDialog() {
        if ( !this.dialogOpenned ) {
            this.dialogOpenned = true;

            // your open code...
        }
    }
}
于 2014-07-14T21:05:08.247 に答える