상세 컨텐츠

본문 제목

안드로이드 AlertDialog back키 설정 또는 안먹게 하기 How to handle Back button with in the dialog?

스마트기기개발관련/안드로이드 개발

by AlrepondTech 2020. 9. 23. 03:54

본문

반응형

 

 

 

=================================

=================================

=================================

 

 

 

 

 

 

 

출처: http://stackoverflow.com/questions/10346011/how-to-handle-back-button-with-in-the-dialog

I am developing one application. In that when the button is pressed i will open a dialog,With OK and Cancel buttons.

It works fine.

My problem is before open the dialog when user press back button i am handling like as fallows

public boolean onKeyDown(int keyCode, KeyEvent event) 
{
    if ((keyCode == KeyEvent.KEYCODE_BACK)) 
    {

    }
 return super.onKeyDown(keyCode, event);
}

It works fine.But when user open the dialog and press the back button,the above method is not called.

How can i handle this?

If any one know the solution please help me

Thanks in advance

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

dialog.setOnKeyListener(new Dialog.OnKeyListener() {

            @Override
            public boolean onKey(DialogInterface arg0, int keyCode,
                    KeyEvent event) {
                // TODO Auto-generated method stub
                if (keyCode == KeyEvent.KEYCODE_BACK) {
                    finish();
                    dialog.dismiss();
                }
                return true;
            }
        });

>there's no need to dismiss the Dialog; finish() takes care of this already. Also, this method probaly should return false to be able to capture key events elsewhere 

----

>I added the && event.getAction() == KeyEvent.ACTION_UP to the answer. Without it, the code block will be executed twice. (Key DOWN and key UP). In this example it is not so important, but for other actions than finish(), it might be very important.

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {         
    @Override
    public void onCancel(DialogInterface dialog) {
        //do whatever you want the back key to do
    }
});

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 AlertDialog alertDialog;

    alertDialog.setOnCancelListener(new OnCancelListener() 
    {                   
           @Override
            public void onCancel(DialogInterface dialog) 
             {
               // TODO Auto-generated method stub

                    dialog.dismiss();                           

            }
}); 

Hope this will help you, and accept it if it is helpful to you.

Thanks..

 

 

 

=================================

=================================

=================================

 

 

 

 

 

반응형

 

 

728x90

 

 

 

출처: http://www.androidpub.com/742379

AlertDialog 가 떠 있는 상태에서 Back 버튼을 누르면 선택없이 되돌아가는데요.
이럴 경우...머리가 복잡해지죠.

그래서. 이 상태에서...Back 버튼을 작동하지 않게 하려고...했는데..
구글링을 통해서... 쉬운 방법을 찾았습니다.

AlertDialog 에 setCancelable 이라는 메서드가 있네요 ㅋㅋ

    @Override
    protected Dialog onCreateDialog(int id) {
    return new AlertDialog.Builder(this)
    .setTitle("Welcome");
    .setPositiveButton("yes", mClick)
    .setNegativeButton("no", mClick)
    .setCancelable(false)
    .create();
    }

목록

엮인글 주소 : http://www.androidpub.com/index.php?document_srl=742379&act=trackback&key=5d0

 

2010.09.03 15:39:10

컴퓨터링

근뎅 다이얼로그에서 프로그레시브바가 도는 상황이라면 대부분 쓰레드에서 와일문으로 돌고있을 텐데 그때는 어차피 버튼이 죽지않나요?ㅎㅎ. . 먼가 뒤에서 돌고있을떄 쓰면 좋을거 같아요~

2010.09.05 21:38:02

tjvkfkd

상황이 어떤 상황이었는지는 잘 안나는데 저 cancelable 이란 함수는 호출 안하는게 좋습니다. 

 

취소되야 할때 취소가 안되는 현상이 생겨요. 예를 들자면 전화가 올때? 

안떠니

취소 버튼이 안되면, 대화상자에 있는 버튼 아무거나 누르면 되는거 아닌가요?
어떤 경우를 말씀하시는지....잘 감이 없네요..ㅠㅠ

2010.09.11 08:54:57

pinetree

이 기능을 얼마나 찾았는지 모릅니다. 정말 감사합니다. SK나 LG ARM 코드 적용시에 이 기능을 구현하지 않아서 앱이 반려되어 해결책을 모색하던 중이었습니다.

2010.09.26 18:00:41

두르두르

setCancelable(false)을 제가 사용해본 예로 안드로이드의 Dialog특성상 모달리스 형태이기에 "확인" 버튼을 꼭 눌러서 수행하게 해야  될때가 있는데 실수로 Back버튼을 눌러서 엉뚱한 일을 수행하게 될수가 있는데요.
이럴때 Back버튼의 사용을 방지하여 꼭 "확인"버튼을 누르도록 만들어 모달 형태의 Dialog로 만들어 사용하시면 됩니다.
단. Back버튼을 누르지 못하게 만들었기에 Dialog가 종료 될 수 있도록 버튼 이벤트를 만들어주어야 겠죠.

 

 

 

=================================

=================================

=================================

 

 

 

팝업창에서 기기의 키를 인식하기 위해서는 setOnKeyListener() 을 셋팅해야

합니다. 인수로 DialogInterface.OnKeyListener 객체를 생성해서 넘기시면 됩니다.

기본함수인 onKey() 에서 keyCode 가 KeyEvent.KEYCODE_BACK 인 값이

기기에서 Back 키를 누를 때 값입니다. KeyEvent.KEYCODE_BACK 일때 어플을

종료하는 finish() 와 다이얼로그를 종료하는 dismiss() 함수를 차례대로 호출합니다.

finish() 만 하면 될 것 같지만 dialog.dismiss() 를 하지 않으면 메모리 릭이 일어

나므로 차례대로 해주시길 바랍니다.

 

// key 셋팅
alertDialogBuilder
        .setOnKeyListener(new DialogInterface.OnKeyListener() {
            public boolean onKey(DialogInterface dialog,
                    int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_BACK) {
                    finish();
                    dialog.dismiss();
                    return true;
                }
                return false;
            }
        });

 

▼ 아래는 기기에서 Back Key 를 눌렀을 때 AlertDialog 를 닫는 전체 Activity

소스입니다. AlertDialog.Builder 로 Builder 를 생성하고 setOnKeyListener() 를

셋팅하였습니다.

 

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;


public class AlertDialogActivity extends Activity implements
        OnClickListener {


    final Context context = this;
    private Button button;


    public void onCreate(Bundle savedInstanceState) {


        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_alert_dialog);


        button = (Button) findViewById(R.id.btn_alert);


        // 클릭 이벤트
        button.setOnClickListener(this);
    }


    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.btn_alert:
            AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
                    context);


            // 제목셋팅
            alertDialogBuilder.setTitle("프로그램 안내");


            // key 셋팅
            alertDialogBuilder
                    .setOnKeyListener(new DialogInterface.OnKeyListener() {
                        public boolean onKey(DialogInterface dialog,
                                int keyCode, KeyEvent event) {
                            if (keyCode == KeyEvent.KEYCODE_BACK) {
                                //dialog.dismiss();
                                return true;
                            }
                            return false;
                        }
                    });


            // AlertDialog 셋팅
            alertDialogBuilder
                    .setMessage("공지사항 내용표현")
                    .setCancelable(false)
                    .setPositiveButton("종료",
                            new DialogInterface.OnClickListener() {
                                public void onClick(
                                        DialogInterface dialog, int id) {
                                    // 프로그램을 종료한다
                                    AlertDialogActivity.this.finish();
                                }
                            })
                    .setNegativeButton("취소",
                            new DialogInterface.OnClickListener() {
                                public void onClick(
                                        DialogInterface dialog, int id) {
                                    // 다이얼로그를 취소한다
                                    dialog.cancel();
                                }
                            });


            // 다이얼로그 생성
            AlertDialog alertDialog = alertDialogBuilder.create();


            // 다이얼로그 보여주기
            alertDialog.show();
            break;


        default:
            break;
        }
    }
}

 

 

 

 

=================================

=================================

=================================

 

 

 

 

 

반응형


관련글 더보기

댓글 영역