예전 자유 게시판

Android 프로그래밍 : AlertDialog 내의 EditText 문제

이일영 2010-09-22 13:09

'시작하세요 안드로이드 프로그래밍'과 직접 연관된 문제는 아니지만 Google site에 보고하기가 쉽지
않아 도움을 청합니다.

안드로이드 SDK의 samples 중에 ApiDemos 패키지에 포함되어 있는 AlertDialog 중, text_entry_dialog
에서는EditText를 사용하는데...  실제로 이곳의 username과 password EditText에 입력하고,
findViewByID로 접근하면 findViewById가 null을 돌려줍니다. 제가 추가 작성한 코드는 아래와 같습니다.
case DIALOG_TEXT_ENTRY:
            // This example shows how to add a custom layout to an AlertDialog
            LayoutInflater factory = LayoutInflater.from(this);
            final View textEntryView = factory.inflate(R.layout.alert_dialog_text_entry, null);
            return new AlertDialog.Builder(AlertDialogSamples.this)
                .setIcon(R.drawable.alert_dialog_icon)
                .setTitle(R.string.alert_dialog_text_entry)
                .setView(textEntryView)
                .setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
    
                        /* User clicked OK so do some stuff */
//============  추가 코딩 ======================================
                        String str;
                        final EditText nameText = (EditText)findViewById(R.id.username_edit);
                            str = nameText.getText().toString();
                        Toast.makeText(AlertDialogSamples.this, "**"+ nameText  + "**", 500).show();
//============ 추가 코딩 끝 ================================================================
                    }
                })
                .setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {

                        /* User clicked cancel so do some stuff */
                    }
                })
                .create();
        }
        return null;


류광 2010-09-23 18:09


Activity의 setContentView와는 달리 AlertDialog.Builder의 setView는 findViewById를 위한 작업을 해주지 않는 것 같은데요. SDK의 버그인지 아니면 원래 그런 것이고 다른 방법이 있는지 한 번 살펴보겠습니다....

류광 2010-09-23 19:09


SDK의 버그는 아니고(원래 AlertDialog.Builder의 setView 는 findViewById와 무관)... 간단한 해결책이 있네요.

final EditText nameText = (EditText)textEntryView.findViewById(R.id.username_edit);

로 하면 됩니다.

그냥 findViewById()는 현재 활동의 onCreate에서 setContentView로 설정한 뷰의 요소들을 검색하는 것이고, 지금처럼 대화상자에 채워 넣은 뷰에서 특정 요소를 찾으려면 해당 뷰에 대해 findViewById()를 호출해야 한다, 입니다. (지금 보니 당연한 말인데 아까 코드를 읽을 때에는 SDK가 잘못 되었나.. 생각부터 들더군요;;;;)

이일영 2010-09-24 01:09

친절 신속한 도움에 감사드립니다.
제 실력의 수준이 낮으니 앞으로도 많은 도움 부탁드립니다.

이 일영.

류광 2010-09-24 19:09


종종 제 호기심을 자극할만한 문제 거리 던져 주시길!

지나가다 2011-10-13 20:10


그냥 findViewById로 해서 null이 날라와서 한참 고생했는데
류광님 대로 하니 잘되네요. 정말 감사합니다.