SharedPreferences无法与TextView一起使用

时间:2019-01-30 13:33:29

标签: android sharedpreferences

我的应用程序中有一个页面,用户可以在其中输入产品名称及其卡路里计数,然后将其从另一个类别的每日卡路里计数中删除。这很完美,我想这样做,以免每次打开页面时都不会重置为原始值(除非它是全新安装/通过按钮手动重置)。

我碰到了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",""));

}
}

http://prntscr.com/me99dp

即使在初始calorieCount值应为2100的情况下,我启动应用程序时的外观图像。

如果我更改了 我的remainingCalories.setText(mPrefs.getString("sessionCalories",""));方法中的第onResume行到: remainingCalories.setText(mPrefs.getString("sessionCalories","3"));,然后最初显示3。

2 个答案:

答案 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设置。

希望它有助于加油:)