我的应用程序中有一个页面,用户可以在其中输入产品名称及其卡路里计数,然后将其从另一个类别的每日卡路里计数中删除。这很完美,我想这样做,以免每次打开页面时都不会重置为原始值(除非它是全新安装/通过按钮手动重置)。
我碰到了SharedPreferences
并试图实现它,但是它总是在我的onResume
方法中提供默认值,我不太确定为什么,需要一些帮助来弄清楚我要做什么。我做错了以及如何解决它,因为我还将需要在其他几个类中使用它。
我的课:
public class CalorieTracker extends AppCompatActivity {
protected String age, calorieCount;
protected EditText itemName, kCal;
protected TextView remainingCalories;
protected Button submitBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_calorie_tracker);
getSupportActionBar().setDisplayShowHomeEnabled(true);
Bundle extras = getIntent().getExtras();
age = extras.getString("age");
calorieCount = extras.getString("calories");
System.out.println(age + ":" + calorieCount);
itemName = findViewById(R.id.productNameCalorieTracker);
kCal = findViewById(R.id.calorie_kcal);
submitBtn = findViewById(R.id.submit_calorie);
remainingCalories = findViewById(R.id.remainingCalorieCount);
remainingCalories.setText(calorieCount);
submitBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int currentCount = Integer.parseInt(remainingCalories.getText().toString());
int enteredAmount = Integer.parseInt(kCal.getText().toString());
calorieCount = String.valueOf(currentCount - enteredAmount);
remainingCalories.setText(calorieCount);
SharedPreferences mPrefs = getPreferences(MODE_PRIVATE);
SharedPreferences.Editor editor = mPrefs.edit();
editor.putString("sessionCalories",remainingCalories.getText().toString());
editor.commit();
}
});
}
@Override
protected void onResume() {
super.onResume();
SharedPreferences mPrefs = getPreferences(MODE_PRIVATE);
remainingCalories.setText(mPrefs.getString("sessionCalories",""));
}
}
即使在初始calorieCount
值应为2100
的情况下,我启动应用程序时的外观图像。
如果我更改了
我的remainingCalories.setText(mPrefs.getString("sessionCalories",""));
方法中的第onResume
行到:
remainingCalories.setText(mPrefs.getString("sessionCalories","3"));
,然后最初显示3。
答案 0 :(得分:0)
确保以共享首选项正确更新数据。在活动生命周期中onviewCreated之后仅创建了onResume。
因此,如果您当前的活动将转到前景或旋转,则只有onResume会再次调用。
这样的解决方案,在设置值后单击按钮,然后从sharedpreference获取值并像这样显示
submitBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// first time save data
setvalueFromSharedpreference()
}
});
public setvalueFromSharedpreference()
{
SharedPreferences mPrefs = getPreferences(MODE_PRIVATE);
remainingCalories.setText(mPrefs.getString("sessionCalories",""));
}
答案 1 :(得分:0)
当我启动应用程序时,即使初始卡路里计数 值应该是2100,我可以使用 捆绑其他内容。
如果我换行 missingCalories.setText(mPrefs.getString(“ sessionCalories”,“”)));在 我的onResume方法: missingCalories.setText(mPrefs.getString(“ sessionCalories”,“ 3”)); 然后最初显示3。
原因editText remainingCalories
始终具有默认值(sharedpreference值)是因为在活动生命周期的onResume
之后调用了onCreate
方法。因此,Bundle extras value
被sharedpreference值覆盖。
您可以通过检查{Intent Extras}是否有价值来通过onCreate
方法来实现。如果是,则设置该值,否则按如下所示设置sharedPrefrence的值
@Override
protected void onCreate(Bundle savedInstanceState) {
...
SharedPreferences mPrefs = getPreferences(MODE_PRIVATE);
calorieCount = mPrefs.getString("sessionCalories","");
Bundle extras = getIntent().getExtras();
age = extras.getString("age");
if(!calorieCount.isEmpty)
remainingCalories.setText(calorieCount);
else
{
calorieCount = extras.getString("calories");
}
System.out.println(age + ":" + calorieCount);
itemName = findViewById(R.id.productNameCalorieTracker);
kCal = findViewById(R.id.calorie_kcal);
submitBtn = findViewById(R.id.submit_calorie);
remainingCalories = findViewById(R.id.remainingCalorieCount);
remainingCalories.setText(calorieCount);
}
然后从onResume
中删除sharedPreference设置。
希望它有助于加油:)