Android에서 예 / 아니요 대화 상자를 표시하는 방법은 무엇입니까?


358

예, AlertDialog.Builder가 있다는 것을 알고 있지만 Android에서 대화 상자를 표시하는 것이 얼마나 어려운지 알고 놀랍습니다.

예전에는 .NET 개발자였으며 ​​다음과 같은 Android가 있습니까?

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


3
AlertDialog 코드를 재개하고 모든 화면에서 이벤트 (예, 조치 없음)를 처리하려면 어떻게합니까? .Net에서는 Action 클래스를 사용하여 이벤트를 처리합니다. 이것을 구현하는 방법이 있습니까? 인터페이스를 사용 하여이 작업을 수행 할 수 있지만 다른 방법을 알고 있습니까?
Ravikumar11

2
예 ..... 우리 .NET 개발자는 안드로이드로 어려움을 겪고 있습니다 .... Xamarin이 훌륭한 도구인지 궁금합니다.
Daniel Möller

답변:


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

3
사용자가 "예"또는 "아니오"버튼을 클릭하면 간단하고 유용한 btw 대화 상자가 사라집니다. 당신이 할 필요가 없습니다.
RRTW

9
나 자신, 나는 그것을 여러 번 사용했다. 그러나 실제로 SO를 찾는 것이 더 쉽고 빠릅니다. 여기에 주어진 코드 샘플은 매우 간단합니다 ... 안드로이드 문서가 다음과 같이 보이기를 바랍니다.
Radu

4
@EricLeschinski 아마 "이것"은 맥락이 아니므로 이것을 시도하십시오 : AlertDialog.Builder builder = new AlertDialog.Builder(getView().getContext());
cldrr

1
@davidglorioso 예 / 아니오 / 아니요 / 예의 순서는 Android 버전에 따라 다르며 제어 할 수 없습니다. 언제 바뀌 었는지 기억이 나지 않지만 4.x 또는 5에 있다고 생각합니다. 어쨌든 변경해서는 안됩니다. 표준 경고 대화 상자를 사용하는 모든 앱은 동일한 아니오 / 예 버튼 순서를 사용하며 사용자가 다르면 사용자에게 혼란을 줄 것입니다. 실제로 다르게하려면 Android 버전에 따라 양수 / 음수 버튼을 수동으로 설정해야합니다.
Steve Haley

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

The constructor AlertDialog.Builder(MainActivity.DrawerItemClickListener) is undefined
해시

@likejiujitsu 당신이 일을 한 후에 어떤 경우에도 메모리에서 대화 상자를 지우고 싶기 때문입니다.
Avi Levin

32

Steve H의 대답은 제자리에 있지만 조금 더 자세한 정보가 있습니다. 대화 상자가 작동하는 방식은 Android의 대화 상자가 비동기 적이므로 대화 상자가 표시되면 실행이 중지되지 않기 때문입니다. 이 때문에 사용자의 선택을 처리하려면 콜백을 사용해야합니다.

대화 상자와 관련하여 Android와 .NET의 차이점에 대한 자세한 내용은이 질문을 확인하십시오. 대화 상자 / AlertDialogs : 대화 상자가 작동하는 동안 "실행 차단"방법 (.NET 스타일)


8
고맙게도 Android 대화 상자가 비동기 적이므로 모든 것이 명확하고 합리적입니다. Android 용 앱을 개발할 때 ".Net에서 생각할 필요"가있는 것 같습니다 :)
Solo

참고 : "비동기 대화 상자"를 GUI 용어에서 "모덜리스 대화 상자"라고하며 "동기 대화 상자"를 "모달 대화 상자"라고합니다. Android는 모달 대화 상자를 제공하지 않습니다 (매우 예외적 인 경우 제외).
Alex

안드로이드는 시스템 모달 대화 상자를 아주 좋은 이유로 허용하지 않습니다. 장치의 다른 앱을 방해해서는 안됩니다.
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

대화하기를 원하는 사람에게 대화하기

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

Steves 답변은 조각으로 오래되었지만 정확합니다. 다음은 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가 임베디드 리스너 대신 구현 하고 사용 하도록 할 수도 있습니다 .


위의 @likejiujitsu이면 충분합니다.
Warpzit

아니오 / 예 상자를 수행하기 위해 FragmentDialog 클래스를 만드는 것은 약간 과장되었습니다 ... :) 기본 AlertDialog는 아직 공정합니다.
Renascienza

@Renascienza 네,하지만 더 이상 사용되지 않습니다.
Warpzit

실제로는 아닙니다. FragmentDialog는 대화 상자에서 조각을 재사용 할 수 있도록 유용한 것으로 추가되었습니다. 조각은 UI 재사용에 관한 것입니다. 새로운 것 (활동을 대체하지 않는 조각) 때문에 조각을 사용할 필요가 없으므로 이익이없는 경우 FragmentDialog를 사용할 필요가 없습니다. 예를 들어 간단한 예 / 아니요 경고입니다.
Renascienza

2
내 권장 사항은 레이아웃뿐만 아니라 배경 및 수명주기 코드를 재사용해야 할 경우 조각 대화 상자를 사용하는 것입니다. 프래그먼트를 사용하면 관련 액티비티 라이프 사이클 컨트롤이 있으며 생성 (사용자가 장치를 회전 할 때 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 wats는 지름길 유틸리티 방법이 있는지 알기 위해
walrii

1
같은 코드를 작성했지만 NO가 먼저 나타난 다음 YES가 기본적으로 NO / YES 대화 상자이지만 YES / NO 대화 상자가 필요합니다. 어떻게해야합니까
Sagar Devanga

Yes (예)에 관해서는 / NO 대 NO는 / YES이 대답을 참조하십시오 stackoverflow.com/a/13644589/1815624는 이 대답에 discribed로 조작 할 수 있습니다 : stackoverflow.com/a/13644536/1815624
CrandellWS

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

여기에있는 모든 대답은 길고 독자에게 친숙하지 않은 코드로 요약됩니다. 나에게 가장 쉬운 방법은 람다를 사용하는 것입니다.

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 레벨 2 (안드로이드 1.1)와 대신을 사용 BUTTON_POSITIVE하고 BUTTON_NEGATIVE내가 사용해야 BUTTON1하고 BUTTON2.


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.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);
}

이제 쉽게 액세스 할 수있는 유틸리티를 만들 수 있습니다 (이 클래스에서는 경고에 대해 다른 애니메이션 또는 사용자 정의 레이아웃을 구현할 수 있음).

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

코 틀린에서 그렇게 쉽게 할 수 있습니다.

 alert("Testing alerts") {
    title = "Alert"
    yesButton { toast("Yess!!!") }
    noButton { }
}.show()

0

들어 코 틀린 안드로이드 ::

    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

코 틀린 구현.

다음과 같은 간단한 함수를 만들 수 있습니다.

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"
  }
})
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.