Java 带有EditText字符串的SharedReference

Java 带有EditText字符串的SharedReference,java,android,Java,Android,当我执行代码时,它会给我一个错误,我试图做的是以某种方式获取用户在alertDialog中插入的值(字符串)。 错误: java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“android.text.Editable android.widget.EditText.getText() 这是我的.java public void verificar(){ SharedPreferences sharedPref = getSharedPreferen

当我执行代码时,它会给我一个错误,我试图做的是以某种方式获取用户在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"

    />

当您使用
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);


}
更改您的DeseAfgular函数,如下所示。因为当你调用
findviewbyd(R.id.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();


}

当您使用
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);


}
更改您的DeseAfgular函数,如下所示。因为当你调用
findviewbyd(R.id.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();


}

如果要实例化
编辑文本
,应该使用
对话框视图
,而不是主视图,因为小部件属于
对话框
中膨胀的视图。尝试在对话框中实例化
EditText
,不要忘记将
EditText b
设为全局变量

使用

与此相反:

 EditText b = findViewById(R.id.userName);//in verifiar()

如果要实例化
编辑文本
,应该使用
对话框视图
,而不是主视图,因为小部件属于
对话框
中膨胀的视图。尝试在对话框中实例化
EditText
,不要忘记将
EditText b
设为全局变量

使用

与此相反:

 EditText b = findViewById(R.id.userName);//in verifiar()

是否从组件类中调用
verifiar()
函数?如果不是,你从哪里调用它?Janzek,你能根据需要发布这个类和其他类或方法的开始吗?正如@Omari所提到的,我们只是想知道您从哪里调用verifiar()函数?请检查我的回答抱歉,我花了很长时间来回答,我将发布调用“verifcar”的方法是从组件类中调用的
verifiar()
函数吗?如果不是,你从哪里调用它?Janzek,你能根据需要发布这个类和其他类或方法的开始吗?正如@Omari提到的,我们只是想知道你从哪里调用verifiar()函数?请检查我的回答抱歉,我花了很长时间来回答,我将发布调用“verifcar”的方法。我刚刚编辑了我的帖子,我发布了包含“verificar”方法的方法,你能检查一下吗?。谢谢你的回答sonhvpI刚刚编辑了我的帖子,我发布了有“验证汽车”方法的方法,你能检查一下吗?。谢谢你的回答