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