我想以共享偏好保存,但应用程序崩溃

Posted

技术标签:

【中文标题】我想以共享偏好保存,但应用程序崩溃【英文标题】:I want to save with shared preference but the app crashes 【发布时间】:2020-07-04 08:51:57 【问题描述】:

我想制作一个基本上用户在 a 中输入一些字符串的应用程序

 <LinearLayout
    android:layout_
    android:layout_
    android:layout_gravity="center"
    android:orientation="horizontal">

    <com.google.android.material.textfield.TextInputLayout

        android:layout_
        android:layout_
        android:layout_weight="2"
        android:textColorHint="#ffffff"
        app:errorEnabled="true">

        <com.google.android.material.textfield.TextInputEditText
            android:id="@+id/texto"
            android:layout_
            android:layout_
            android:backgroundTint="#4249ff"
            android:hint="@string/BtnO"
            android:textColor="#ffffff" />
    </com.google.android.material.textfield.TextInputLayout>

    <Button
        android:layout_
        android:layout_
        android:layout_weight="1"
        android:onClick="confirmInput"
        android:text="@string/Btns" />

</LinearLayout>

因此,当用户按下确认按钮时,我希望将其保存,但应用程序崩溃了,这是我第一次使用共享首选项时,我不太明白。我没有保存用户的值.另外我知道我已经使用了提示,但是根据我的共享偏好,它会将提示更改为文本,而不是保持不变。 这是我的java代码:

public class MainActivity extends AppCompatActivity 
    private EditText nameInput;
    private EditText homeInput;
    private SharedPreferences prefs;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        SharedPreferences prefs= getSharedPreferences("my_data",MODE_PRIVATE);
        String name = prefs.getString("MY_NAME","name");
        String home = prefs.getString("MY_HOME","home");

        ((EditText)findViewById(R.id.texto)).setText(name);
        ((EditText)findViewById(R.id.textd)).setText(home);

        nameInput =(EditText)findViewById(R.id.texto);
        nameInput =(EditText)findViewById(R.id.textd);

    

    public void copy(View view) 
    

    public void confirmInput(View view) 
        String name=nameInput.getText().toString();
        SharedPreferences.Editor editor = prefs.edit();
        editor.putString("MY_NAME",name);
        editor.apply();
    
    public void confirmInput2(View view) 
        String home=homeInput.getText().toString();
        SharedPreferences.Editor editor=prefs.edit();
        editor.putString("MY_HOME",home);
        editor.apply();
    


【问题讨论】:

您应该首先从 Android logcat 获取堆栈跟踪。这会告诉你哪一行代码导致了崩溃。 【参考方案1】:

我认为错误是因为SharedPreferences prefs有两个声明,一个在onCreate方法级别,另一个在类的开头

只需删除首选项声明 onCreate 并使用在类开头定义的变量即可修复错误,如下所示

   @Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //Take a look here!
    this.prefs= getSharedPreferences("my_data",MODE_PRIVATE);
    String name = prefs.getString("MY_NAME","name");
    String home = prefs.getString("MY_HOME","home");

    ((EditText)findViewById(R.id.texto)).setText(name);
    ((EditText)findViewById(R.id.textd)).setText(home);

    nameInput =(EditText)findViewById(R.id.texto);
    nameInput =(EditText)findViewById(R.id.textd);


【讨论】:

【参考方案2】:

只需做这个小改动:

    prefs= 
         getSharedPreferences("my_data",MODE_PRIVATE);
         String name=prefs.getString("MY_NAME","name");

代替

      SharedPreferences prefs= 
       getSharedPreferences("my_data",MODE_PRIVATE);
       String name = prefs.getString("MY_NAME","name");

您已经在全局范围内定义了 sharedpref 对象。您不需要再次创建它。

【讨论】:

以上是关于我想以共享偏好保存,但应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

关闭xamarin后保存android应用字符串值

Android Studio - 共享偏好无法保存在新活动中

如何使用共享首选项让用户保持登录状态?

如何在单击按钮时将按钮颜色保存到共享首选项?

使用共享首选项保存列表时遇到问题(仍需要帮助)

iOS 10:共享图像/保存图像开始崩溃