当我执行代码时,这给了我一个错误,我试图做的是尝试以某种方式获取用户在alertDialog中插入的值(字符串)。 错误:
java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'android.text.Editable android.widget.EditText.getText()'
这是我的.java
public void verificar(){
SharedPreferences sharedPref = getSharedPreferences("PREFS",Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
EditText b = findViewById(R.id.userName);
String nombre = b.getText().toString(); //Obtengo el nombre que se inserto en el cuadro
editor.putInt("lastScore",cont);
editor.putString("lastNombre",nombre);
editor.commit();
Intent intent = new Intent(getApplicationContext(),Ranking.class);
startActivity(intent);
}
这是我的XML,带有EditText
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="15dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Usted esta en el top10!. Desea figurar?"
android:textSize="20sp"
android:textAlignment="center"
/>
<EditText
android:id="@+id/userName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Enter name"
android:inputType="textPersonName"
android:textSize="20sp"
android:layout_marginTop="10dp"
/>
这是具有“验证性”的方法
public void deseaFigurar(){
final AlertDialog.Builder builder= new AlertDialog.Builder(this);
LayoutInflater inflater = this.getLayoutInflater();
builder.setView(inflater.inflate(R.layout.dialog, null))
.setPositiveButton("Figurar" , new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
verificar();
finish();
}
})
.setNegativeButton("No figurar", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Intent intent = new Intent(MainActivity.this,Ranking.class);
startActivity(intent);
}
});
builder.show();
}
答案 0 :(得分:0)
当您将findViewById(R.id.userName)
与对话框中的视图一起使用时,您需要通过对话框才能找到它,我不知道何时以及如何初始化对话框,但是应该这样使用它:dialog.findViewById(R.id.userName)
。您可以通过更改函数参数(如下面的代码)快速修复它,并在调用时将对话框传递给函数参数。
public void verificar(View dialogView){
SharedPreferences sharedPref = getSharedPreferences("PREFS",Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
EditText b = dialogView.findViewById(R.id.userName);
String nombre = b.getText().toString(); //Obtengo el nombre que se inserto en el cuadro
editor.putInt("lastScore",cont);
editor.putString("lastNombre",nombre);
editor.commit();
Intent intent = new Intent(getApplicationContext(),Ranking.class);
startActivity(intent);
}
如下更改deseaFigurar函数。因为当您致电findViewById(R.id.userName)
时。这是一种属于Activity的方法,用于在Activity布局中查找视图,因此将导致null异常,因为不存在带有userName id的EditText。您需要在已放大的对话框视图中找到它。
public void deseaFigurar(){
final AlertDialog.Builder builder= new AlertDialog.Builder(this);
LayoutInflater inflater = this.getLayoutInflater();
View dialogView = inflater.inflate(R.layout.dialog, null);
builder.setView(dialogView)
.setPositiveButton("Figurar" , new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
verificar(dialogView);
finish();
}
})
.setNegativeButton("No figurar", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Intent intent = new Intent(MainActivity.this,Ranking.class);
startActivity(intent);
}
});
builder.show();
}
答案 1 :(得分:0)
如果要实例化dialogView
,则应使用EditText
而不是主视图,因为小部件属于dialog
中膨胀的视图。尝试在对话框中实例化EditText
,并且不要忘记使EditText b
成为全局变量
使用
b = dialog.findViewById(R.id.userName);//in the dialog
代替此:
EditText b = findViewById(R.id.userName);//in verifiar()