Возврат из диалога или действия с результатом - PullRequest
17 голосов
/ 29 июля 2011

Я хотел бы знать, могу ли я заморозить текущее действие, пока я ожидаю завершения другого действия или диалогового окна (любой может),

Я знаю, что могу запустить действие для результатов и обработатьони есть, но код после 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
}

Я знаю, что это должно звучать довольно странно, но я бы хотелочень ценю, если кто-нибудь подскажет, как добиться такой функциональности.

Ответы [ 8 ]

10 голосов
/ 29 июля 2011

В диалоге Если вы хотите получить результат диалога, то ваш путь не является правильным способом получить результат диалога.вместо вашего пути в 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 голосов
/ 29 июля 2011

Вы можете использовать onActivityResult также
В вашей основной деятельности звоните
startActivityForResult(intent, 1); //here 1 is the request code

В вашем классе диалога

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
}
}
3 голосов
/ 11 апреля 2012

Я использую обратный вызов в моем диалоге, чтобы вернуть некоторую строку или значение, выбранное пользователем.

т.е. реализовать интерфейс в вашем диалоге

1 голос
/ 19 августа 2018

Для тех, кто заинтересован в реализации диалогового окна для получения результата, но без с использованием 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
        );

    }

Другой способ , подходит, если вам нужно реализовать различные варианты диалоговых окон, поскольку вы можете определить все действия в одном месте.

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 голос
/ 10 августа 2017

Вы можете использовать onActivityResult.

, вот мой код.

  1. при запуске деятельности.Например, вы вызываете TestActivity из MainActivity, вы можете сделать это следующим образом.

    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 голос
/ 29 июля 2011

Попробуйте дать диалогу кнопку, реализующую onClickListener с вызовом метода для чего-то в вашей деятельности.Код в указанном методе будет запускаться только при нажатии кнопки, поэтому вы можете вызывать этот метод с другим параметром для кнопок, в зависимости от того, что они сделали.

0 голосов
/ 22 сентября 2013

Я несколько лет опаздываю с ответом на этот вопрос, но, тем не менее, вот мой ответ.

У меня есть класс, который представляет форму / файл. Он имеет открытый член "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 голосов
/ 29 июля 2011

Я тоже не до конца понимаю.Если вы хотите отловить результат от активности, вы можете просто начать с того, что вы назвали функцию «startActivityForResult».Если вы хотите зафиксировать некоторые результаты в диалоге, то вы можете просто поместить все функции (которые должны продолжаться после нажатия кнопки в диалоговом окне) в onClickListener каждой кнопки в диалоговом окне

...