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

спасибо заранее! Алекс!--3-->

3 ответов


приведите диалог в виде представления:

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

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

Не работает: final Dialog dialog = новый диалог (это); ... ключвходной = (полей EditText) findViewById, чтобы найти(ИД Р..key_input);

строительство: final Dialog dialog = новый диалог (это); ... ключвходной = (полей EditText) диалог.команду findViewById(Р. ИД.key_input);


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

вот очень простой пример кода для пользовательского диалога, содержащего 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();

            }
        });