具有EditText字符串的SharedPreference

时间:2019-06-15 20:33:19

标签: java android

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


}

2 个答案:

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