【问题标题】:Get AlertDialog input [duplicate]获取 AlertDialog 输入 [重复]
【发布时间】:2026-01-01 19:45:01
【问题描述】:

我有两个习惯AlertDialog所有工作,因为我无法获得用户的输入,我创建了一个名为 MyDialog 的类并放置了构造函数。 此外,我想用 EditText 放置一个 getter;但是,我找不到获取输入的方法。

这里是MyDialog类:

public class MyDialog {
    public static AlertDialog.Builder create(final Context context, final LayoutInflater layoutInflater, final String title, final String content) {
        View view = layoutInflater.inflate(R.layout.userdialog, null);
        ((TextView)view.findViewById(R.id.textViewTitleDialog)).setText(title);
        ((TextView)view.findViewById(R.id.textViewContentDialog)).setText(content);
        ((EditText)view.findViewById(R.id.etEmailNuevo)).getText();
        return new AlertDialog.Builder(context).setView(view);
    }

    public String getEmailNuevo(String NewEmail) {
        return NewEmail;
    }
}

我在EditText 中创建了setText(),而不是getText();但是,我当时在我的Fragment 上使用这个类。 我不知道怎么称呼它。我在Toast 中尝试了getText().toString();;然而,它并没有出现。我做错了什么?

这是我使用这个类的地方:

AlertDialog.Builder myDialog = MyDialog.create(context, getLayoutInflater(savedInstanceState), "Cambio de email", "Introduce nuevo email");
myDialog.setPositiveButton(R.string.canviaruserdialog, new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int id) {

    }
})
.setNegativeButton(R.string.cancelaruserdialog, null)
.show();

编辑 1

我已将代码更改为:

final AlertDialog.Builder myDialog = MyDialog.create(context, getLayoutInflater(savedInstanceState), "Cambio de email", "Introduce nuevo email");
final String pew = MyDialog.getEntry();
myDialog.setPositiveButton(R.string.canviaruserdialog, new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int id) {
        Toast.makeText(getActivity(), pew, Toast.LENGTH_LONG).show();
    }
})
.setNegativeButton(R.string.cancelaruserdialog, null)
.show();

我的班级看起来像:

private static EditText mEditText;
public static AlertDialog.Builder create(final Context context, final LayoutInflater layoutInflater, final String title, final String content) {
    View view = layoutInflater.inflate(R.layout.userdialog, null);
    ((TextView)view.findViewById(R.id.textViewTitleDialog)).setText(title);
    ((TextView)view.findViewById(R.id.textViewContentDialog)).setText(content);
    ((EditText)view.findViewById(R.id.etEmailNuevo)).getText();
    return new AlertDialog.Builder(context).setView(view);
}

public static String getEntry() {
    return mEditText.getText().toString();
}

这是 Logcat 错误

2927-2927/info.androidhive.slidingmenu E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: info.androidhive.slidingmenu, PID: 2927
java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
    at info.androidhive.slidingmenu.MyDialog.getEntry(MyDialog.java:26)
    at info.androidhive.slidingmenu.ConfiguracionFragment.onClick(ConfiguracionFragment.java:45)
    at android.view.View.performClick(View.java:4756)
    at android.view.View$PerformClick.run(View.java:19749)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5221)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

编辑 2

我已经改变了逻辑,现在,我正在尝试这样做:

我创建了一个EditText 和一个String,如下所示:

EditText mEt;
private String m_Text = "";

这是我发起这个EditText的地方:

mEt = (EditText) rootView.findViewById(R.id.etEmailNuevo);

然后,我按如下方式执行AlertDialog

LayoutInflater inflater = getLayoutInflater(savedInstanceState);
View dialoglayout = inflater.inflate(R.layout.userdialog, null);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

Dialog dialog = new Dialog(getActivity());
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

final EditText input = mEt; //null<--------

input.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
builder.setView(dialoglayout);

builder.setPositiveButton("Cambiar", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        m_Text = input.getText().toString();
        Toast.makeText(getActivity(), m_Text, Toast.LENGTH_LONG).show();
    }
});
builder.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        dialog.cancel();
    }
});

builder.show();

但是,它仍然给我这个EditText 是空的。 我不知道如何将此EditText 与来自userdialogR.id.etEmailNuevo 链接起来。

【问题讨论】:

  • @Blackbelt 找不到在 Toast 中显示用户输入文本的方法(例如)
  • @jlindenbaum 我说我在你的网址中尝试过getText().toString();,但对我不起作用,我无法获取文本。
  • 你真的需要阅读how to debug your app
  • @codeMagic 我做了,但我认为我的问题是因为我试图调用一个不在我的课堂上的方法,因为我从我的MyDialog 创建了一个AlertDialog.Builder,这就是为什么我不知道怎么调用那个方法...
  • 可能是因为mEditTextnull

标签: java android android-alertdialog


【解决方案1】:

你没有正确使用getText()

如果您想在对话框中获取 EditText 的内容,您应该执行以下操作:

1) 在 MyDialog 类中,为您的 EditText 创建一个成员变量

private EditText mEditText;

将 findViewById(R.id.etEmailNuevo) 行设置为等于该值。

2) 创建一个获取EditText当前内容的方法

public String getEntry() {
     return mEditText.getText().toString();
}

3) 然后,当您创建对话框时,在 onClick 中调用此方法,一切就绪。

【讨论】:

  • 或者他可以使用DialogInterface dialog 参数来查找EditText
  • 我尝试调用 MyDialog.getEntry() 并说无法解析此方法