带EditText的AlertDialog

时间:2018-03-21 10:56:45

标签: android alertdialog textedit

在activity_main.xml中,我有一个按钮,用于打开一个带有两个textedit字段的AlertDialog(dialog_login.xml);但是当我点击"登录"按钮,我尝试将textedit内容存储在一个字符串中,我收到以下输出: "尝试在空对象引用"上调用虚方法。 我注意到如果我将一个EditText放在activity_main.xml文件中,并且在警告对话框中使用相同的id,我就不会收到错误,所以程序在activity_main.xml中查找EditText,而不是在dialog_login.xml。 我能怎么做?感谢

这是我的代码:

MainActivity.java

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.rese.login_session_dialog.MainActivity">


    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />


</android.support.constraint.ConstraintLayout>

activity_main.xml中

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/logintext"
        android:layout_gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="25dp"
        android:text="Login Phase" />

    <EditText
        android:id="@+id/username"
        android:layout_gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName"
        android:hint="Username" />

    <EditText
        android:id="@+id/password"
        android:layout_gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPassword"
        android:hint="Password" />
</LinearLayout>

dialog_login.xml

{{1}}

5 个答案:

答案 0 :(得分:1)

EditText不在您的活动布局中,您无法直接执行findViewById

这样做findViewById

mUsername = (EditText)v.findViewById(R.id.username);
mPassword = (EditText)v.findViewById(R.id.password);

而不是这个

 mUsername = (EditText)findViewById(R.id.username);
 mPassword = (EditText)findViewById(R.id.password);

FYI 您可以像这样使用

mUsername = v.findViewById(R.id.username);
mPassword = v.findViewById(R.id.password);

答案 1 :(得分:1)

我想你的问题在这里

  v = inflater.inflate(R.layout.dialog_login, null);
                AlertDialog.Builder mBuilder = new AlertDialog.Builder(MainActivity.this);
                mBuilder.setView(v);

                mUsername = (EditText)findViewById(R.id.username);
                mPassword = (EditText)findViewById(R.id.password);

,特别是

  mUsername = (EditText)findViewById(R.id.username);
  mPassword = (EditText)findViewById(R.id.password);

那意味着你想在活动布局中找到你的文字

FindViewById应该来自布局,其中有小部件

所以这是正确的

  mUsername = (EditText)v.findViewById(R.id.username);
  mPassword = (EditText)v.findViewById(R.id.password);

答案 2 :(得分:0)

在获取对话框视图之前,您错过了对话框参考

您的对话框引用是&#39; v&#39;。

以这种方式获取对话框视图

mUserName =(EditText)dialogRefernce.findviewById(R.id.username);

mUsername = (EditText)v.findViewById(R.id.username);
mPassword = (EditText)v.findViewById(R.id.password);

您的对话框参考已保存到&#39; v&#39;。如果不使用对话框(视图)引用,则无法获得视图。

答案 3 :(得分:0)

这是因为你没有从膨胀的布局中获取视图。

您只需要替换

mUsername = (EditText)v.findViewById(R.id.username);
mPassword = (EditText)v.findViewById(R.id.password);

通过此

mUsername = (EditText)findViewById(R.id.username);
mPassword = (EditText)findViewById(R.id.password);

v是包含 EditText 的实际视图。

默认情况下,findViewById从Activity的绑定布局中获取来自 activity_main 的视图,并且它没有对话框的EdiText,这就是它提供NullPointerException的原因。

答案 4 :(得分:0)

The way you find ID is incorrect Please replace


b.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                v = inflater.inflate(R.layout.dialog_login, null);
                AlertDialog.Builder mBuilder = new AlertDialog.Builder(MainActivity.this);
                mBuilder.setView(v);

                mUsername = (EditText)v.findViewById(R.id.username);
                mPassword = (EditText)v.findViewById(R.id.password);

                mBuilder.setPositiveButton("Login", new DialogInterface.OnClickListener()
                {
                    @Override
                    public void onClick(DialogInterface dialog, int id)
                    {
                        try
                        {   String username = mUsername.getText().toString();   }
                        catch(Exception e)
                        {   Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();  }
                    }
                });

                mBuilder.show();
            }
        });
    }