EditText внутри AlertDialog всегда null - PullRequest
3 голосов
/ 23 мая 2011

Я ищу по темам, но пока не нашел того, что искал.Я создал настраиваемый диалог оповещения, который появляется, и я могу сделать с ним практически все.Это пользовательский диалог состоит из 3 TextViews и 3 EditText, но всякий раз, когда мне нужно получить EditText, я получаю нулевой компонент.

Из моего XML-файла

 <TextView android:layout_alignParentTop="true" 
    android:id="@+id/txtAccName" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="Name"
    android:textSize="23dp"
    >

</TextView>
<EditText android:id="@+id/txtEditName" 
    android:layout_below="@+id/txtAccName" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="" 
    android:maxLength="20"
    >

Я пытаюсь получить поле EditText с:

    EditText txtAccName = (EditText) findViewById(R.id.txtEditName);
    Log.d("#############################", "txtAccName="+txtAccName.getText().toString());

Но при этом первая строка работает хорошо,второй дом вызывает сбой, и управление является нулевым.Это метод Overwrite, который я использую для создания нужного мне AlertDialog.

    @Override
protected Dialog onCreateDialog(int id) {
    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    final View layout = inflater.inflate(R.layout.accountdialog, (ViewGroup) findViewById(R.id.accDialog));

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

    builder.setNegativeButton(android.R.string.cancel,new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {

        }
        });
    builder.setPositiveButton(android.R.string.ok,
            new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
                EditText txtAccName = (EditText) findViewById(R.id.txtEditName);
                //EditText txtAccCur = (EditText) findViewById(R.id.txtEditCur);
                //EditText txtAccCountry = (EditText) findViewById(R.id.txtEditCountry);
                //DBConn db = new DBConn(Accounts.this.getApplicationContext(), "msaverdb", null, 0);
                Log.d("#############################", "CALLING db.insertAccount");
                Log.d("#############################", "txtAccName="+txtAccName.getText().toString());
                //db.insertAccount(txtAccName.getText().toString(), txtAccCountry.getText().toString(), 
                //      txtAccCur.getText().toString());
                Accounts.this.removeDialog(ACC_DIALOG);
            }
            });
    builder.setNegativeButton(android.R.string.cancel,
            new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
                Accounts.this.removeDialog(ACC_DIALOG);
            }
            });
    builder.setView(layout);
    AlertDialog ad = builder.create();
    return ad;
}

Любая помощь наиболее ценится.

Ответы [ 3 ]

13 голосов
/ 23 мая 2011

Обратите внимание на то, как все ваши вызовы методов разрешаются в ваших анонимных внутренних классах.

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

Ваш вызов по проблемной строке кода:

EditText txtAccName = (EditText) findViewById(R.id.txtEditName);

разрешается в Activity#findViewById.Но макет вашего диалога не привязан к окну вашей активности, он прикреплен к диалогу.Вы можете найти правильную ссылку на представление несколькими способами, но самый простой в вашем случае - это, вероятно, поиск в корне макета, который вы надули:

EditText txtAccName = (EditText) layout.findViewById(R.id.txtEditName);
2 голосов
/ 23 мая 2011

Когда вы используете findViewById, вы неявно ссылаетесь на текущую активность. Часть, которую вы должны изменить, -

EditText txtAccName = (EditText) ad.findViewById(R.id.txtEditName);

вместо

EditText txtAccName = (EditText) findViewById(R.id.txtEditName);

когда вы пытаетесь ее решить. Вам также придется изменить область действия AlertDialog объекта ad на весь класс и убедиться, что он не равен нулю, прежде чем искать в нем представления. Вот и все.

1 голос
/ 05 октября 2013

Объяснение Адампа великолепно.Но этот метод не работал для меня.Самый простой способ для меня такой:

builder.setPositiveButton(R.string.positive, new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   Dialog dialogView = (Dialog) dialog;
                   EditText et;
                   et = (EditText) dialogView.findViewById(R.id.addressinput);

Надеюсь, это кому-нибудь поможет.

...