如何从AlertDialogBox(EditText.xml)获取字符串输入

时间:2017-09-22 16:45:43

标签: java android xml android-edittext android-alertdialog

以下是我需要从EditText AlertDialog获取文字的方法

public void checkButton() {
    leggspillere = (Button) findViewById(R.id.leggspillere);       
    final LayoutInflater inflater = this.getLayoutInflater();       
    AlertDialog.Builder builder = new AlertDialog.Builder(this);   
    builder.setView(inflater.inflate(R.layout.create_user,null));              
    builder.setMessage("Lag en spiller");
    builder.setCancelable(true);
    builder.setPositiveButton("Ok",
        new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {                
                // trying to get the EditText-string inside alertdialogbox input here.
                final String Name = UserName.                       
                Person person = new Person(Name, 0);                       
                dialog.dismiss();
                spillere.setText(person.getName() + " " + person.getScore());
            }
        }
    );
    //sette andre knappen "cancel"
    builder.setNegativeButton("no",
        new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                dialog.cancel();
            }
        }
    );
    AlertDialog alert = builder.create();
    alert.show();
}

XML:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="64dp"
        android:scaleType="center"
        android:background="#FFFFBB33"
        android:contentDescription="@string/app_name" />

    <EditText
        android:id="@+id/UserName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="4dp"
        android:layout_marginLeft="4dp"
        android:layout_marginRight="4dp"
        android:layout_marginTop="16dp"
        android:inputType="textEmailAddress" />
</LinearLayout>

尝试从EditText.xml获取输入/字符串以生成person对象。 始终引用null对象。我无法找到任何解决方案,请指点我。

5 个答案:

答案 0 :(得分:2)

您是如何尝试访问DialogInterface.OnClickListener内的editText的?

尝试在View对象中获取膨胀的视图,并在该View对象变量上执行findViewById。下面的代码应该可以正常工作:

LayoutInflater inflater = this.getLayoutInflater();
AlertDialog.Builder builder = new AlertDialog.Builder(this);
final View dialogView = inflater.inflate(R.layout.dialog_alert, null);
builder.setView(dialogView);
builder.setMessage("Lag en spiller");
builder.setCancelable(true);
builder.setPositiveButton("Ok",
        new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                EditText editText = (EditText) dialogView.findViewById(R.id.d_alert_et);
                Log.v("tag", "Edit text value: " + editText.getText());
            }
        });
builder.setNegativeButton("no",
        new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                dialog.cancel();
            }
        });
AlertDialog alert = builder.create();
alert.show();

基本上在视图对象中获取膨胀的视图:

最终查看dialogView = inflater.inflate(R.layout.dialog_alert,null);

然后在该View对象上执行findViewById:

EditText editText =(EditText)dialogView.findViewById(R.id.d_alert_et);

<强> editText.getText()

答案 1 :(得分:0)

PLS。请参阅此代码:https://www.mkyong.com/android/android-custom-dialog-example/

// custom dialog
final Dialog dialog = new Dialog(context);
dialog.setContentView(R.layout.custom);
dialog.setTitle("Title...");

// set the custom dialog components - text, image and button
TextView text = (TextView) dialog.findViewById(R.id.text);
text.setText("Android custom dialog example!");
ImageView image = (ImageView) dialog.findViewById(R.id.image);
**EditText edtName = (EditText) dialog.findViewById(R.id.edtName);**
image.setImageResource(R.drawable.ic_launcher);

Button dialogButton = (Button) 
dialog.findViewById(R.id.dialogButtonOK);
// if button is clicked, close the custom dialog
dialogButton.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        **String s = edtName.getText().toString();**
        dialog.dismiss();
    }
});

dialog.show();
}

答案 2 :(得分:0)

我更喜欢使用Material Dialog库,因为它非常易于使用。

您可以使用自定义视图或使用simple input

1.来自我的项目的简单输入示例:

new MaterialDialog.Builder(this)
    .title(R.string.input)
    .content(R.string.input_content)
    .inputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD)
    .input(R.string.input_hint, R.string.input_prefill, new MaterialDialog.InputCallback() {
        @Override
        public void onInput(MaterialDialog dialog, CharSequence input) {
            // Do something
        }
    }).show();

2.自定义视图示例:

        View view = LayoutInflater.from(context).inflate(R.layout.dialog_new_queue, null, false);

        MaterialDialog dialog = new MaterialDialog.Builder(context)
                .customView(view, false).build();
        AutoCompleteTextView tv = view.findViewById(R.id.dialog_add_q_tv);
        Button btn = view.findViewById(R.id.dialog_add_queue_btn);
        btn.setOnClickListener(v -> {
            String input = tv.getText().toString().trim();
            Observable
                    .create(emitter -> {
                        if (input.isEmpty()) {
                            emitter.onError(new IllegalArgumentException("اسم صف خالی است"));
                        } else if (dao.getQueue(pref.getLastUsername(), input) != null) {
                            emitter.onError(new IllegalArgumentException("این اسم تکراری است!"));
                        } else {
                            QueueModel q = new QueueModel(input, pref.getLastUsername(), System.currentTimeMillis());
                            dao.insert(q);
                            emitter.onComplete();
                        }
                    })
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(o -> {},e ->{
                        tv.setError(e.getMessage());
                        tv.requestFocus();
                    },() -> {
                        Toast.makeText(context, "صف جدید ساخته شد", Toast.LENGTH_SHORT).show();
                        dialog.dismiss();
                        loadData();
                    });
        });
        dialog.show();

答案 3 :(得分:0)

替换2行:

final String Name = UserName. 
Person person = new Person(Name, 0); 

通过

EditText editText = (EditText) dialogView.findViewById(R.id.UserName);
Person person = new Person(editText.getText(), 0); 

答案 4 :(得分:0)

试试这个

public void checkButton() {
leggspillere = (Button) findViewById(R.id.leggspillere);
AlertDialog.Builder builder = new AlertDialog.Builder(this);

LayoutInflater inflater = this.getLayoutInflater();

builder.setView(inflater.inflate(R.layout.create_user, null));
builder.setMessage("Lag en spiller");
builder.setCancelable(true);
builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int id) {
        //Change here
        Dialog myDialog = (Dialog) dialog;
        EditText editText = (EditText) myDialog.findViewById(R.id.UserName);
        Person person = new Person(editText.getText(), 0); 
    }
})
 //sette andre knappen "cancel"
builder.setNegativeButton("no",  new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int id) {
        dialog.dismiss();
    }
});      
 builder.create().show();
}