Возврат из диалога или действия с результатом

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

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

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

Ответ 1

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

Ответ 2

Вы можете использовать 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

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

вот мой код.

  • когда вы начинаете работу. ex) вы вызываете 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);
    
  • в TestActivity.

    public void onClickCancel() {
        setResult(Activity.RESULT_CANCELED);
        finish();
    }
    
    public void onClickConfirm() {
        setResult(Activity.RESULT_OK);
        finish();
    }
    
  • когда вы получите код результата в 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...
        }
    }