SharedPreferences не работает с TextView - PullRequest
0 голосов
/ 30 января 2019

В моем приложении есть страница, где пользователь может ввести название продукта и его количество калорий, которое затем удаляется из ежедневного количества калорий, полученного из другого класса.Это прекрасно работает, я хотел сделать так, чтобы он не сбрасывался к исходному значению при каждом открытии страницы (если это не новая установка / ручной сброс с помощью кнопки).

Я сталкивался 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, которое я получаю с предыдущей страницы, используя дополнительные функции Bundle.

Если я изменю строку remainingCalories.setText(mPrefs.getString("sessionCalories","")); в моем методе onResume, на: remainingCalories.setText(mPrefs.getString("sessionCalories","3"));затем он показывает 3 изначально.

Ответы [ 2 ]

0 голосов
/ 30 января 2019

при загрузке приложения, даже если начальное значение calorieCount должно быть 2100, которое я получаю с предыдущей страницы, используя дополнительные функции Bundle.

Если я изменяю строку оставшиесяCalories.setText (mPrefs.GetString ( "sessionCalories", ""));в моем методе onResume, чтобы: ОстальныеCalories.setText (mPrefs.getString ("sessionCalories", "3"));затем сначала отображается 3.

Причина editText remainingCalories всегда имеет значение по умолчанию (значение sharedpreference), потому что метод onResume вызывается после onCreate в жизненном цикле действия.Вот почему Bundle extras value перезаписывается значением sharedpreference.

Этого можно добиться в методе onCreate, проверив, имеет ли Intent extras значение.Если да, то установите это значение, в противном случае установите значение 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);
}

И удалите параметр sharedPreference из onResume.

Надеюсь, что это помогает ура :):

0 голосов
/ 30 января 2019

Убедитесь, что ваши данные обновляются в общих настройках правильно.В жизненном цикле Activity после 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",""));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...