我正在尝试创建一个供我自己使用的应用程序,并且我正在尝试将3个editText框保存到Sharedpref,以便我可以使用这些值在应用程序中稍后计算。
以下是代码:
SharedPreferences mSharedPreferences;
private EditText mEditTextBench;
private EditText mEditTextSquat;
private EditText mEditTextDead;
private Button mButton;
public String maxDead = mSharedPreferences.getString("maxDead", "DEFAULT");
然后在oncreate方法中我有:
mSharedPreferences= PreferenceManager.getDefaultSharedPreferences(this.getBaseContext());
mButton = (Button) findViewById(R.id.button);
mEditTextBench = (EditText) findViewById(R.id.editTextBench);
mEditTextSquat = (EditText) findViewById(R.id.editTextSquat);
mEditTextDead = (EditText) findViewById(R.id.editTextDead);
和我的按钮onclicklistener:
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SharedPreferences.Editor editor = mSharedPreferences.edit();
editor.putString("maxDead", mEditTextDead.getText().toString());
editor.commit();
如果我将公共String maxDead作为最终字符串放在onCreate方法中,它可以工作,但我希望以后能够使用editText更改字符串。我认为我不能把它作为决赛。
现在代码的方式,我收到了这个错误:
尝试在空对象引用上调用接口方法'java.lang.String android.content.SharedPreferences.getString(java.lang.String,java.lang.String)'
答案 0 :(得分:1)
你的代码应该是这样的。
SharedPreferences mSharedPreferences;
private EditText mEditTextBench;
private EditText mEditTextSquat;
private EditText mEditTextDead;
private Button mButton;
public String maxDead;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.your_layout);
mSharedPreferences= PreferenceManager.getDefaultSharedPreferences(this.getBaseContext());
maxDead = mSharedPreferences.getString("maxDead", "DEFAULT");
mButton = (Button) findViewById(R.id.button);
mEditTextBench = (EditText) findViewById(R.id.editTextBench);
mEditTextSquat = (EditText) findViewById(R.id.editTextSquat);
mEditTextDead = (EditText) findViewById(R.id.editTextDead);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SharedPreferences.Editor editor = mSharedPreferences.edit();
editor.putString("maxDead", mEditTextDead.getText().toString());
editor.commit();
}
});
}
编辑:此处我正在展示使用SharedPreference
的方式
SharedPreferences myPreference;
String MY_PREFERENCE = "my_preference";
在onCreate initialise SharedPreference
中:
myPreference = getSharedPreferences(MY_PREFERENCE, Context.MODE_PRIVATE);
获取价值
String data = myPreference.getString("maxDead", "")
用于编辑SharedPreference
:
SharedPreferences.Editor editor = myPreference.edit();
editor.putString("maxDead", mEditTextDead.getText().toString());
editor.commit();
我希望这会有所帮助。
答案 1 :(得分:0)
您因此而收到错误:
public String maxDead = mSharedPreferences.getString("maxDead", "DEFAULT");
因为您没有初始化mSharedPreferences
所以,它正在抛出NullPointerException
。
将其更改为:
public String maxDead;
然后在初始化maxDead
后在onCreate
方法中初始化mSharedPreferences
:
maxDead = mSharedPreferences.getString("maxDead", "DEFAULT");
<强>更新强>
由于变量maxDead
的值仅在onClickListener
中设置一次,因此您无法获得maxData
内onCreate
的更新值。因此,在maxData
中更新SharedPreferences
的值时,不会更新变量。因此,您应该使用这样的方法来获取SharedPreference
的最新值,而不是保留变量:
private String getMaxDead(){
if(mSharedPreferences == null)
mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this.getBaseContext());
return mSharedPreferences.getString("maxDead", "DEFAULT");
}
所以在你的吐司中使用:getMaxDead()
它会起作用。
答案 2 :(得分:0)
我对Android也很新,但我会尝试回答。您获得异常的原因是,在创建活动时,String maxDead
中没有任何内容,因为它在顶部被指定为private String maxDead
。您只需在单击按钮时为其指定值。你想在哪里使用这个值?我还不能发表评论,这就是为什么我在答案中写这个的原因。 :(
这是我如何使用SharedPreferences的示例:
SharedPreferences spref = getSharedPreferences("MY_PREFS", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = spref.edit();
editor.putString("maxDead", mEditTextDead.getText().toString());
editor.apply;
然后在某处(另一个活动/片段),你需要这个值:
String maxDead = spref.getString("maxDead", "");