web-dev-qa-db-ja.com

結果を伴うダイアログまたはアクティビティから戻る

現在のアクティビティをフリーズできるかどうかを知りたいのですが、別のアクティビティやダイアログ(何でもかまいません)が完了するのを待っています。

結果のアクティビティを開始してそこで処理できることはわかっていますが、startActivityForResult()の後のコードは引き続き実行されます

これは私がやりたいことです:

PopupDialog dialog = new PopupDialog(this,Android.R.style.Theme_Black_NoTitleBar);
dialog.show();
// wait here, and continue the code after the dialog has finishes
int result = getResultFromDialogSomehow();
if (result == 1){
    //do something
}else{
    //do something else
}

奇妙に聞こえるかもしれませんが、そのような機能を実現する方法を誰かに教えてもらえれば幸いです。

18
zidarsk8

ダイアログの場合ダイアログの結果が必要な場合、ダイアログの結果を取得する方法が正しくありません。 Android=の代わりに、ダイアログボタンの選択後に実行できるコールバックメソッドがあります。

例えば

AlertDialog.Builder builder = new AlertDialog.Builder(getDialogContext());
builder.setMessage("Message");
builder.setPositiveButton("Yes", new Dialog.OnClickListener() {

    @Override
    public void onClick(DialogInterface dialog, int which) { 
        Toast.makeText(this, "Yes", Toast.LENGTH_SHORT).show();
        dialog.cancel();
    }

});

builder.setNegativeButton("No", new Dialog.OnClickListener() {

    @Override
    public void onClick(DialogInterface dialog, int which) {
        Toast.makeText(this, "Yes", Toast.LENGTH_SHORT).show();
        dialog.cancel();

    }

});

builder.show();

このコードを実行すると、onClickメソッド内のコードは実行されませんが、ダイアログのボタンをクリックすると実行されます。ダイアログのボタンのいずれかをクリックすると、コールバックメソッドが取得されますonClickと実行されます。

10
Dharmendra

onActivityResultも使用できます
メインアクティビティの呼び出し
startActivityForResult(intent, 1); //here 1 is the request code

あなたのDialogクラス

Intent intent = new Intent();
intent.putExtra(....) //add data if you need to pass something
setResult(2,intent); //Here 2 result code

だからあなたの主な活動

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
if (resultCode == 2 && requestCode ==1){
    //do something
}else{
    //do something else
}
}
10

ダイアログでコールバックを使用して、ユーザーが選択した文字列または値を返します。

つまり、ダイアログにインターフェイスを実装します

3

結果を取得するためのダイアログボックスを実装する方法に関心があるが、なしを使用するonActivityResultを使用する場合は、ここにを使用した例を示します。コールバック。このようにして、どこからでもこのカスタムダイアログボックスを呼び出し、選択に応じて何かを行うことができます。

短い方法

public void getDialog(Context context, String title, String body, 

    DialogInterface.OnClickListener listener){

        AlertDialog.Builder ab = new AlertDialog.Builder(context);
        ab
                .setTitle(title)
                .setMessage(body)
                .setPositiveButton("Yes", listener)
                .setNegativeButton("Cancel", listener)
        ;//.show();

        Dialog d=ab.create();
        d.setCanceledOnTouchOutside(false);

        d.show();
    }

    private void showDialog(){
        DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                switch (which){
                    case DialogInterface.BUTTON_POSITIVE:
                        //DO
                        break;

                    case DialogInterface.BUTTON_NEGATIVE:
                        //DO
                        break;
                }
            }
        };

        getDialog(
                this,
                "Delete",
                "Are you sure to delete the file?",
                dialogClickListener
        );

    }

別の方法、すべてのアクションを1か所で定義できるため、ダイアログボックスのさまざまなバリエーションを実装する必要がある場合に適しています。

MyDialog.Java

public class MyDialog{

    public void deleteDialog(Context context){
        DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                switch (which){
                    case DialogInterface.BUTTON_POSITIVE:
                        if(listener!=null)
                            listener.onDeleteDialogResponse(true);
                        break;

                    case DialogInterface.BUTTON_NEGATIVE:
                        if(listener!=null)
                            listener.onDeleteDialogResponse(false);
                        break;
                }
            }
        };

        AlertDialog.Builder ab = new AlertDialog.Builder(context);
        ab.setMessage("Are you sure to delete?")
                .setPositiveButton("Yes", dialogClickListener)
                .setNegativeButton("Cancel", dialogClickListener)
                .show();


    }

/** my listner */
    public interface MyDialogListener{
        public void onDeleteDialogResponse(boolean respononse);
    }
    private MyDialogListener listener;

    public void setListener(MyDialogListener listener) {
        this.listener = listener;
    }

}

このように使用します

private void showDialog(){        
        MyDialog dialog=new MyDialog();
        dialog.setListener(new MyDialog.MyDialogListener() {
            @Override
            public void onDeleteDialogResponse(boolean respononse) {
                if(respononse){
                    //toastMe("yessss");
                    //DO SOMETHING IF YES
                }else{
                    //toastMe("noooh");
                    //DO SOMETHING IF NO
                }
            }
        });

            dialog.deleteDialog(this);
}
1
chandima

onActivityResultを使用できます。

これが私のコードです。

  1. あなたが活動を開始したとき。例)MainActivityからTestActivityを呼び出すと、次のようになります。

    Constants.REQUEST_CODE = 1000; // this is a global variable...and it must be a unique.
    ....
    Intent intent = new Intent(this, TestActivity.class);
    startActivityForResult(intent, Constants.REQUEST_CODE);
    
  2. testActivityで。

    public void onClickCancel() {
        setResult(Activity.RESULT_CANCELED);
        finish();
    }
    
    public void onClickConfirm() {
        setResult(Activity.RESULT_OK);
        finish();
    }
    
  3. mainActivityで結果コードを取得すると、次のようになります。

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    
        if (requestCode == Constants.REQUEST_CODE && resultCode == Activity.RESULT_OK) {
            // todo something...
        } else if (requestCode == Constants.REQUEST_CODE && resultCode == Activity.RESULT_CANCELED) {
            // todo something...
        }
    }
    
1
Rooney

ダイアログにボタンを付け、onClickListenerをアクティビティの何かへのメソッド呼び出しで実装してみてください。上記のメソッドのコードは、ボタンがクリックされたときにのみ実行されるため、ボタンの動作に応じて、ボタンの異なるパラメーターを使用してそのメソッドを呼び出します。

1
thegrinner

また、よくわかりません。アクティビティの結果を取得したい場合は、「startActivityForResult」関数を指定して開始するだけです。ダイアログでいくつかの結果をキャッチしたい場合は、ダイアログのすべてのボタンのonClickListenerにすべての関数(ダイアログのボタンを押した後も継続する必要があります)を単に配置できます。

0
Menion Asamm

私はこの質問への回答に数年遅れていますが、それでも私の回答です。

フォーム/ファイルを表すクラスがあります。オンデマンドでファイルを遅延できるパブリックメンバー「deleteDialog()」があり、呼び出し側に「true」または「false」の値を返します。

これは次のようになります。

import Android.app.AlertDialog;
import Android.content.Context;
import Android.content.DialogInterface;

public class Form {

private Context mContext;
private CharSequence mFilePath;
private boolean mDeleted = false; // Set to "true" if this file is deleted. 
    /*...etc etc...*/

public boolean deleteDialog() {
    DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
        //@Override
        public void onClick(DialogInterface dialog, int which) {
            switch (which){
            case DialogInterface.BUTTON_POSITIVE:
                //Do your Yes progress
                mDeleted = mContext.deleteFile(mFilePath.toString());
                break;

            case DialogInterface.BUTTON_NEGATIVE:
                //Do your No progress
                mDeleted = false;
                break;
            }
        }
    };
    AlertDialog.Builder ab = new AlertDialog.Builder(mContext);
    ab.setMessage("Are you sure to delete?")
        .setPositiveButton("Yes", dialogClickListener)
        .setNegativeButton("Cancel", dialogClickListener)
        .show();
    return mDeleted;
}

結果の変数-"mDeleted"-は、囲んでいるクラスのメンバーでなければならないことがわかります。これは、Javaの奇妙ですが素晴らしい気まぐれによるものです。ここで、内部クラス(この場合: "DialogInterface.OnClickListener dialogClickListener")は、その外部クラスの状態を継承できます。

0
Adam Weingarten