如何在Android上显示是/否对话框?


358

是的,我知道这里有AlertDialog.Builder,但是我很震惊地知道在Android中显示对话框有多困难(至少对程序员不友好)。

我曾经是.NET开发人员,但我想知道以下Android是否等效?

if (MessageBox.Show("Sure?", "", MessageBoxButtons.YesNo) == DialogResult.Yes){
    // Do something...
}


3
如何在所有屏幕中恢复AlertDialog代码并处理事件(是,没有操作)?在.Net中,我们使用Action类来处理事件,有什么方法可以实现?我知道使用接口我们可以做到这一点,但是还有其他方法吗?
Ravikumar15年

2
是的。我们的.NET开发人员确实对使用android感到很苦。
DanielMöller'17

Answers:


745

AlertDialog.Builder实际上并不难使用。起初肯定有点吓人,但是一旦使用了一点,它既简单又强大。我知道您已经说过知道如何使用它,但是无论如何,这只是一个简单的示例:

DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        switch (which){
        case DialogInterface.BUTTON_POSITIVE:
            //Yes button clicked
            break;

        case DialogInterface.BUTTON_NEGATIVE:
            //No button clicked
            break;
        }
    }
};

AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage("Are you sure?").setPositiveButton("Yes", dialogClickListener)
    .setNegativeButton("No", dialogClickListener).show();

DialogInterface.OnClickListener如果还有其他是/否框也应该做同样的事情,则也可以重用该框。

如果要从中创建对话框View.OnClickListener,则可以使用view.getContext()来获取上下文。或者,您可以使用yourFragmentName.getActivity()


3
新的AlertDialog.Builder(this); 编译时错误:“未定义构造函数AlertDialog.Builder(new View.OnClickListener(){})”
Eric Leschinski 2012年

3
顺便说一句,简单而有用的对话框将在用户单击“是”或“否”按钮后关闭。您无需执行任何操作。
RRTW

9
我本人,我已经使用了很多次。但是我发现实际上可以更轻松,更快速地查看SO。这里给出的代码示例非常简单...我真的希望Android文档看起来像这样。
Radu

4
@EricLeschinski可能不是“上下文”,请尝试以下上下文: AlertDialog.Builder builder = new AlertDialog.Builder(getView().getContext());
cldrr

1
@davidglorioso是/否或否/是的顺序取决于Android的版本,您无法控制它。我不记得它何时更改,但我认为它是在4.x或5中。这样说,无论如何您都不应该更改它。所有使用标准警报对话框的应用程序都将使用相同的“否” /“是”按钮顺序,如果您的应用程序不同,这会使用户感到困惑。如果您确实希望与众不同,则必须根据Android版本手动设置正/负按钮。
史蒂夫·哈利

163

尝试这个:

AlertDialog.Builder builder = new AlertDialog.Builder(this);

builder.setTitle("Confirm");
builder.setMessage("Are you sure?");

builder.setPositiveButton("YES", new DialogInterface.OnClickListener() {

    public void onClick(DialogInterface dialog, int which) {
        // Do nothing but close the dialog

        dialog.dismiss();
    }
});

builder.setNegativeButton("NO", new DialogInterface.OnClickListener() {

    @Override
    public void onClick(DialogInterface dialog, int which) {

        // Do nothing
        dialog.dismiss();
    }
});

AlertDialog alert = builder.create();
alert.show();

25
就个人而言,我更喜欢该代码段,而不是公认的答案
John

1
@nikki为什么都具有dismiss()?
likejudo 2014年

The constructor AlertDialog.Builder(MainActivity.DrawerItemClickListener) is undefined
哈希

@likejiujitsu那就是因为在您完成工作后无论如何都想从内存中清除对话框。
阿维·莱文

32

史蒂夫·哈(Steve H)的答案很明确,但是这里有更多信息:对话框按其工作方式工作的原因是因为Android中的对话框是异步的(显示对话框时执行不会停止)。因此,您必须使用回调来处理用户的选择。

请查看此问题,以更长时间地讨论Android和.NET(与对话框有关)之间的差异: 对话框/ AlertDialogs:如何在对话框启动时“阻止执行”(.NET样式)


8
谢谢,Android对话框是异步的,现在使一切变得清晰(合理)。看来我需要“思考的.NET去”开发应用程序时,Android的:)

仅供参考:您所说的“异步对话框”在GUI术语中称为“无模式对话框”,而“同步对话框”称为“模式对话框”。Android不具有模式对话框(在特殊情况下除外)。
亚历克斯

Android禁止系统模式对话框的原因非常充分:不允许干扰设备上的其他应用程序。
Renascienza

14

这为我工作:

AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());

    builder.setTitle("Confirm");
    builder.setMessage("Are you sure?");

    builder.setPositiveButton("YES", new DialogInterface.OnClickListener() {

        public void onClick(DialogInterface dialog, int which) {

            // Do nothing, but close the dialog
            dialog.dismiss();
        }
    });

    builder.setNegativeButton("NO", new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {

            // Do nothing
            dialog.dismiss();
        }
    });

    AlertDialog alert = builder.create();
    alert.show();

7

询问某人是否要呼叫Dialog ..

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.Toast;

public class Firstclass extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {    
        super.onCreate(savedInstanceState);    
        setContentView(R.layout.first);

        ImageView imageViewCall = (ImageView) findViewById(R.id.ring_mig);

        imageViewCall.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v){
                try{
                    showDialog("0728570527");
                } catch (Exception e){
                    e.printStackTrace();
                }                   
            }    
        });    
    }

    public void showDialog(final String phone) throws Exception {
        AlertDialog.Builder builder = new AlertDialog.Builder(Firstclass.this);

        builder.setMessage("Ring: " + phone);       

        builder.setPositiveButton("Ring", new DialogInterface.OnClickListener(){
            @Override
            public void onClick(DialogInterface dialog, int which){

                Intent callIntent = new Intent(Intent.ACTION_DIAL);// (Intent.ACTION_CALL);                 
                callIntent.setData(Uri.parse("tel:" + phone));
                startActivity(callIntent);

                dialog.dismiss();
            }
        });

        builder.setNegativeButton("Abort", new DialogInterface.OnClickListener(){   
            @Override
            public void onClick(DialogInterface dialog, int which){
                dialog.dismiss();
            }
        });         
        builder.show();
    }    
}

5

史蒂夫的答案是正确的,尽管已经过时了。这是FragmentDialog的示例。

班级:

public class SomeDialog extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new AlertDialog.Builder(getActivity())
            .setTitle("Title")
            .setMessage("Sure you wanna do this!")
            .setNegativeButton(android.R.string.no, new OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // do nothing (will close dialog)
                }
            })
            .setPositiveButton(android.R.string.yes,  new OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // do something
                }
            })
            .create();
    }
}

要启动对话框:

            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
            // Create and show the dialog.
            SomeDialog newFragment = new SomeDialog ();
            newFragment.show(ft, "dialog");

您也可以让类实现onClickListener并使用它而不是嵌入式侦听器。


上面的@likejiujitsutsu就足够了。
Warpzit 2014年

创建一个FragmentDialog类只是为了做一个no / yes框是有点过度设计... :)默认的AlertDialog还是足够的。
Renascienza

@Renascienza是的,但我相信它已经过时了。
Warpzit 2014年

并不是的。FragmentDialog被添加为有用的东西,允许您在对话框上重用片段。片段全部与UI重用有关。由于您不需要仅仅因为是新事物而使用碎片(碎片不会替代活动),因此在无济于事的情况下,无需使用FragmentDialog。例如,简单的是/否警报。
Renascienza

2
我的建议是:如果不仅需要重用布局,还需要背景和生命周期代码,请使用“片段”对话框。使用该片段,您可以进行相关的活动生命周期控制,并且可以对诸如create(在用户旋转设备时重新创建UI),暂停,继续等事件做出反应。如果您不需要它,并且对话框非常简单,则常规对话框可以正常工作。
Renascienza

5

谢谢nikki,您的回答仅通过添加所需的操作即可帮助我改善现有条件,如下所示

AlertDialog.Builder builder = new AlertDialog.Builder(this);

builder.setTitle("Do this action");
builder.setMessage("do you want confirm this action?");

builder.setPositiveButton("YES", new DialogInterface.OnClickListener() {

    public void onClick(DialogInterface dialog, int which) {
        // Do do my action here

        dialog.dismiss();
    }

});

builder.setNegativeButton("NO", new DialogInterface.OnClickListener() {

    @Override
    public void onClick(DialogInterface dialog, int which) {
        // I do not need any action here you might
        dialog.dismiss();
    }
});

AlertDialog alert = builder.create();
alert.show();

我的印象是OP不想使用AlertDialog.Builder。OP会想知道是否存在快捷实用程序方法,
walrii 2012年

1
我已经编写了相同的代码,但是首先出现NO,然后是YES,基本上是一个NO / YES对话框,但是我需要一个YES / NO对话框。我该怎么做
Sagar Devanga 2014年

至于“是/否”与“否/是”,请参见以下答案:stackoverflow.com/a/13644589/1815624您可以按照此答案中的说明进行操作:stackoverflow.com/a/13644536/1815624
CrandellWS 2014年

4

在科特林:

AlertDialog.Builder(this)
    .setTitle(R.string.question_title)
    .setMessage(R.string.question_message)
    .setPositiveButton(android.R.string.yes) { _, _ -> yesClicked() }
    .setNegativeButton(android.R.string.no) { _, _ -> noClicked() }
    .show()

3

以命令链的形式匿名显示对话框,而无需定义其他对象:

 new AlertDialog.Builder(this).setTitle("Confirm Delete?")
                        .setMessage("Are you sure?")
                        .setPositiveButton("YES",
                                new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int which) {

                                       // Perform Action & Dismiss dialog                                 
                                        dialog.dismiss();
                                    }
                                })
                        .setNegativeButton("NO", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                // Do nothing
                                dialog.dismiss();
                            }
                        })
                        .create()
                        .show();

2

这里的所有答案都归结为冗长且不便于读者阅读的代码:这正是询问者试图避免的内容。对我而言,最简单的方法是在此处使用lambda:

new AlertDialog.Builder(this)
        .setTitle("Are you sure?")
        .setMessage("If you go back you will loose any changes.")
        .setPositiveButton("Yes", (dialog, which) -> {
            doSomething();
            dialog.dismiss();
        })
        .setNegativeButton("No", (dialog, which) -> dialog.dismiss())
        .show();

Android中的Lambdas需要Retrolambda插件(https://github.com/evant/gradle-retrolambda),但是无论如何,这对于编写更简洁的代码很有帮助。


1

谢谢。我使用的是API Level 2(Android 1.1),而不是BUTTON_POSITIVEBUTTON_NEGATIVE我必须使用BUTTON1BUTTON2


1

1.创建AlertDialog设置消息,标题和正,负按钮:

final AlertDialog alertDialog = new AlertDialog.Builder(this)
                        .setCancelable(false)
                        .setTitle("Confirmation")
                        .setMessage("Do you want to remove this Picture?")
                        .setPositiveButton("Yes",null)
                        .setNegativeButton("No",null)
                        .create();

2.现在在DialogInterface上找到两个按钮,然后单击setOnClickListener():

alertDialog.setOnShowListener(new DialogInterface.OnShowListener() {
            @Override
            public void onShow(DialogInterface dialogInterface) {
                Button yesButton = (alertDialog).getButton(android.app.AlertDialog.BUTTON_POSITIVE);
                Button noButton = (alertDialog).getButton(android.app.AlertDialog.BUTTON_NEGATIVE);
                yesButton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        //Now Background Class To Update Operator State
                        alertDialog.dismiss();
                        Toast.makeText(GroundEditActivity.this, "Click on Yes", Toast.LENGTH_SHORT).show();
                        //Do Something here 
                    }
                });

                noButton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        alertDialog.dismiss();
                        Toast.makeText(GroundEditActivity.this, "Click on No", Toast.LENGTH_SHORT).show();
                        //Do Some Thing Here 
                    }
                });
            }
        });

3.要显示Alertdialog:

alertDialog.show();

注意:不要忘记使用AlertDialog的最终关键字。


0
AlertDialog.Builder altBx = new AlertDialog.Builder(this);
    altBx.setTitle("My dialog box");
    altBx.setMessage("Welcome, Please Enter your name");
    altBx.setIcon(R.drawable.logo);

    altBx.setPositiveButton("Ok", new DialogInterface.OnClickListener()
    {
      public void onClick(DialogInterface dialog, int which)
      {
          if(edt.getText().toString().length()!=0)
          {
              // Show any message
          }
          else 
          {

          }
      }
    });
    altBx.setNeutralButton("Cancel", new DialogInterface.OnClickListener()
    {
      public void onClick(DialogInterface dialog, int which)
      {
          //show any message
      }

    });
  altBx.show();  

0

您可以为决策实施通用解决方案,并在其他情况下不仅用于是/否,还可以通过动画或布局自定义警报:

像这样的东西;首先创建用于传输数据的类:

public class AlertDecision {

    private String question = "";
    private String strNegative = "";
    private String strPositive = "";

    public AlertDecision question(@NonNull String question) {
        this.question = question;
        return this;
    }

    public AlertDecision ansPositive(@NonNull String strPositive) {
        this.strPositive = strPositive;
        return this;
    }

    public AlertDecision ansNegative(@NonNull String strNegative) {
        this.strNegative = strNegative;
        return this;
    }

    public String getQuestion() {
        return question;
    }

    public String getAnswerNegative() {
        return strNegative;
    }

    public String getAnswerPositive() {
        return strPositive;
    }
}

接口返回结果后

public interface OnAlertDecisionClickListener {

    /**
     * Interface definition for a callback to be invoked when a view is clicked.
     *
     * @param dialog the dialog that was clicked
     * @param object The object in the position of the view
     */
    void onPositiveDecisionClick(DialogInterface dialog, Object object);
    void onNegativeDecisionClick(DialogInterface dialog, Object object);
}

现在,您可以轻松创建一个utils以进行访问(在此类中,您可以为警报实现不同的动画或自定义布局):

public class AlertViewUtils {

    public static void showAlertDecision(Context context,
                                         @NonNull AlertDecision decision,
                                         final OnAlertDecisionClickListener listener,
                                         final Object object) {

        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setMessage(decision.getQuestion());
        builder.setPositiveButton(decision.getAnswerPositive(),
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        listener.onPositiveDecisionClick(dialog, object);
                    }
                });

        builder.setNegativeButton(decision.getAnswerNegative(),
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        listener.onNegativeDecisionClick(dialog, object);
                    }
                });

        android.support.v7.app.AlertDialog dialog = builder.create();
        dialog.show();
    }
}

活动或片段中的最后一个呼叫;您可以将其用于自己的情况或用于其他任务:

public class MainActivity extends AppCompatActivity {

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity);
        initResources();
    }

    public void initResources() {
        Button doSomething = (Button) findViewById(R.id.btn);
        doSomething.setOnClickListener(getDecisionListener());
    }

    private View.OnClickListener getDecisionListener() {
        return new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDecision decision = new AlertDecision()
                        .question("question ...")
                        .ansNegative("negative action...")
                        .ansPositive("positive action... ");
                AlertViewUtils.showAlertDecision(MainActivity.this,
                        decision, getOnDecisionListener(), v);
            }
        };
    }

    private OnAlertDecisionClickListener getOnDecisionListener() {
        return new OnAlertDecisionClickListener() {
            @Override
            public void onPositiveDecisionClick(DialogInterface dialog, Object object) {

                //do something like create, show views, etc...
            }

            @Override
            public void onNegativeDecisionClick(DialogInterface dialog, Object object) {
                //do something like delete, close session, etc ...
            }
        };
    }
} 


0

对于Android中的Kotlin::

    override fun onBackPressed() {
        confirmToCancel()
    }

    private fun confirmToCancel() {
        AlertDialog.Builder(this)
            .setTitle("Title")
            .setMessage("Do you want to cancel?")
            .setCancelable(false)
            .setPositiveButton("Yes") {
                dialog: DialogInterface, _: Int ->
                dialog.dismiss()
                // for sending data to previous activity use
                // setResult(response code, data)
                finish()
            }
            .setNegativeButton("No") {
                dialog: DialogInterface, _: Int ->
                dialog.dismiss()
            }
            .show()
    } 

0

Kotlin实施。

您可以创建一个简单的函数,如下所示:

fun dialogYesOrNo(
        activity: Activity,
        title: String,
        message: String,
        listener: DialogInterface.OnClickListener
    ) {
        val builder = AlertDialog.Builder(activity)
        builder.setPositiveButton("Yes", DialogInterface.OnClickListener { dialog, id ->
            dialog.dismiss()
            listener.onClick(dialog, id)
        })
        builder.setNegativeButton("No", null)
        val alert = builder.create()
        alert.setTitle(title)
        alert.setMessage(message)
        alert.show()
    }

并这样称呼它:

dialogYesOrNo(
  this,
  "Question",
  "Would you like to eat?",
  DialogInterface.OnClickListener { dialog, id ->
    // do whatever you need to do when user presses "Yes"
  }
})
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.