Подтвердить что ты не робот

Android: Как получить Edittext.getText() в пользовательском AlertDialog?

В этом разделе объясняется, что мне нужно... Я не могу получить EditText из своего пользовательского представления в android. Все, что я получаю, это исключение Nullpointer.:/ Я отметил, где проблемы находятся в коде с комментариями. ID: s верны, а мой XML-макет - это простой RelativeLayout, содержащий два атрибута EditText. Очевидно, что здесь я пропустил что-то тривиальное, но теперь я смотрел на код почти на 2 часа, не решая этого, поэтому я подумал, что вместо этого попробую попробовать.

protected void showLoginDialog() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    // Get the layout inflater
    LayoutInflater inflater = this.getLayoutInflater();

    // Inflate and set the layout for the dialog
    // Pass null as the parent view because its going in the dialog layout
    builder.setView(inflater.inflate(R.layout.activity_login, null))
    // Add action buttons
    .setPositiveButton(R.string.login, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {

            /* ERROR HERE! */
            EditText uName, passWord;
            uName = (EditText) findViewById(R.id.login_username);
            passWord = (EditText) findViewById(R.id.login_password);

            Log.i(TAG, uName.getText().toString() + " " + passWord.getText().toString());
            /* STOP */

            if(the_view.getSocketTask().isConnected) {
                the_view.getSocketTask().send_command("LOGIN ");
            } else {
                showToast("Not connected!");
            }
        }
    })
    .setNegativeButton(R.string.cancel,  new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
            dialog.dismiss();
        }
    });      
    builder.create().show();
}

EDIT:

После предложений следующий код является рабочим! Еще раз спасибо!

protected void showLoginDialog() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    // Get the layout inflater
    LayoutInflater inflater = this.getLayoutInflater();



    // Inflate and set the layout for the dialog
    // Pass null as the parent view because its going in the dialog layout
    builder.setView(inflater.inflate(R.layout.activity_login, null))
    // Add action buttons
    .setPositiveButton(R.string.login, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
            Dialog f = (Dialog) dialog;
            /* ERROR HERE! */
            EditText uName, passWord;
            uName = (EditText) f.findViewById(R.id.login_username);
            passWord = (EditText) f.findViewById(R.id.login_password);

            Log.i(TAG, uName.getText().toString() + " " + passWord.getText().toString());
            /* STOP */

            if(the_view.getSocketTask().isConnected) {
                the_view.getSocketTask().send_command("LOGIN ");
            } else {
                showToast("Not connected!");
            }
        }
    })
    .setNegativeButton(R.string.cancel,  new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
            dialog.dismiss();
        }
    });      
    builder.create().show();
}

Спасибо заранее! Alex

4b9b3361

Ответ 1

Ввести диалог как вид:

View v_iew=inflater.inflate(R.layout.activity_login, null)) ;
builder.setView(v_iew);

Затем замените:

        uName = (EditText) findViewById(R.id.login_username); 
        passWord = (EditText) findViewById(R.id.login_password);

с

        uName = (EditText) v_iew.findViewById(R.id.login_username);
         passWord = (EditText) v_iew.findViewById(R.id.login_password); 

Ответ 2

(Не могу проголосовать так, чтобы создать новый ответ: взял мне часы, чтобы понять это, добавив, наконец, определитель, как вы уже выяснили)

Не работает: final Диалог диалога = новый диалог (это); ... keyInput = (EditText) findViewById (R.id.key_input);

Работает: final Диалог диалога = новый диалог (это); ... keyInput = (EditText) dialog.findViewById(R.id.key_input);

Ответ 3

В случае EditText вы должны реализовать TextWatcher Как правило, очень плохое использование editText.getText()

Вот очень простой пример кода для Custom Dialog, содержащий EditText как часть макета. Существует также кнопка, которая должна быть на том же макете, который при нажатии показывает вам текст, который вы только что ввели. Получайте удовольствие!

        final String inputString = null;
        final Dialog dialog = new Dialog(YourActivityName.this);
        dialog.setContentView(R.layout.custom_dialog_layout);
        EditText editText = (EditText) dialog.findViewById(R.id.id_of_edit_text);
        Button done = (Button) dialog.findViewById(R.id.done);
        dialog.show();
        editText.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                inputString = s.toString();

            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                // TODO Auto-generated method stub

            }

            @Override
            public void afterTextChanged(Editable s) {
                // TODO Auto-generated method stub

            }
        });

        done.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Toast.makeText(YourActivityName.this, inputString, Toast.LENGTH_SHORT);
                dialog.dismiss();

            }
        });