1

У меня есть активность с двумя TextViews, которые показывают значения int. Эти значения изменяются постепенно (1, 2, 3 и т. Д.), Когда пользователь нажимает кнопку. Я использую SharedPreferences для сохранения этих значений с помощью нажатия кнопки. Когда я закрываю приложение и снова его открываю, значения отображаются правильно в TextViews, но если они меняются, их следует добавить из предыдущего сохраненного значения. Проблема в том, что они начинают отсчитываться от нуля.Общие предпочтения не сохраняют данные int

Вот мой код:

public class Roulette1 extends ActionBarActivity { 

Button button0, button1; 
int click_button0, click_button1; 

public static final String button0Str = "button0Key"; 
public static final String button1Str = "button1Key"; 
public static final String MyPREFERENCES = "MyPrefsRoulette1"; 
SharedPreferences sharedpreferences; 

TextView times_0_tv; 
TextView times_1_tv; 

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

    times_0_tv = (TextView) findViewById(R.id.times_0); 
    times_1_tv = (TextView) findViewById(R.id.times_1); 

    button0 = (Button) findViewById(R.id.button0); 
    button1 = (Button) findViewById(R.id.button1); 

    final TextView total_clicks_tv = (TextView) findViewById(R.id.total_clicks); 

    button1.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      click_button1 = click_button1 + 1; 
      int total_clicks = click_button0 + click_button1; 
      total_clicks_tv.setText(String.valueOf(total_clicks)); 

      times_0_tv.setText(click_button0); 
      times_1_tv.setText(click_button1); 

    button0.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      click_button0 = click_button0 + 1; 
      int total_clicks = click_button0 + click_button1; 
      total_clicks_tv.setText(String.valueOf(total_clicks)); 

      times_0_tv.setText(click_button0); 
      times_1_tv.setText(click_button1); 

     } 
    }); 

    sharedpreferences = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE); 
    if (sharedpreferences.contains(button0Str)) 
    { 
     times_0_tv.setText(sharedpreferences.getString(button0Str, "")); 
    } 
    if (sharedpreferences.contains(button1Str)) 
    { 
     times_1_tv.setText(sharedpreferences.getString(button1Str, "")); 
    } 
} 

public void run1(View view) { 

    SharedPreferences.Editor editor = sharedpreferences.edit(); 

    String times0string = times_0_tv.getText().toString(); 
    String times1string = times_1_tv.getText().toString(); 
    editor.putString(button0Str, times0string); 
    editor.putString(button1Str, times1string); 

    editor.commit(); 
} 

Надежда у вас есть какие-либо идеи. Благодаря!

+0

«Проблема в том, что они начинают отсчитываться от нуля». Счастливчик. Вы даже не инициализируете их до нуля. Или другое значение. Для этого вы должны получить предупреждение о компиляции. – greenapps

+0

'Общие настройки не хранят данные int. Неправильно. Вы пытаетесь сохранить строки. Не ints. – greenapps

ответ

2

Когда вы читаете из sharedPrefs, не забудьте обновить счетчики полей, а не только значение textViews.

Как было предложено в комментариях, возможным решением было бы использовать значение textView как состояние, обновив его напрямую. В противном случае вы должны обновлять счетчики вручную, например, путем обновления значения полей одновременно с обновлением значения textView. Лично я предпочитаю, чтобы состояние было отделено от презентации, поэтому легче вычислить что-то с этим значением позже (недостатком является то, что вы должны синхронизировать представление. Это может измениться с the new data binding library).

PS Я намеренно не поставил никакого кода, потому что решение тривиально, и есть другие ответы с кодом, но что более важно, потому что я считаю, что библиотека привязки данных - это гораздо более чистый способ справиться с такими проблемами, хотя он все еще находится в стадии бета-тестирования.

+0

Это правильный ответ, переменные счетчика int никогда не инициализируются данными из общих настроек: click_button0 и click_button1. Вы действительно должны уточнить свой ответ. – Knossos

+2

Лучшим было бы покончить с ними. Затем просто прочитайте старое значение из текстового поля при увеличении. – greenapps

0

Sharedpreferences сохраненные данные int также. Проверить эту ссылку: http://androidexample.com/Android_SharedPreferences_Basics/index.php?view=article_discription&aid=126&aaid=146

SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", MODE_PRIVATE); 
    Editor editor = pref.edit(); 


/**************** Storing data as KEY/VALUE pair *******************/ 

    editor.putBoolean("key_name1", true);   // Saving boolean - true/false 
    editor.putInt("key_name2", "int value");  // Saving integer 
    editor.putFloat("key_name3", "float value"); // Saving float 
    editor.putLong("key_name4", "long value");  // Saving long 
    editor.putString("key_name5", "string value"); // Saving string 

    // Save the changes in SharedPreferences 
    editor.commit(); // commit changes 

Я думаю, что есть какая-то логическая ошибка в коде. Пожалуйста, проверьте.

0

Добавьте этот код в самом начале вашего OnCreate:

SharedPreferences sharedpreferences = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE); 

times0string = String.valueOf(sharedPreferences.getString(button0Str, 0)); 
times1string = String.valueOf(sharedPreferences.getString(button1Str, 0)); 
0

Чтобы решить проблему, попробуйте ниже код:

Заменить первые две строки внутри button1 onClick()

click_button1 = Integer.parseInt(sharedpreferences.getString(button1Str, "")) + 1; 
int total_clicks = Integer.parseInt(sharedpreferences.getString(button0Str, "")) + click_button1; 

Заменить первый две линии внутри button0 onClick()

click_button0 = Integer.parseInt(sharedpreferences.getString(button0Str, "")) + 1; 
int total_clicks = click_button0 + Integer.parseInt(sharedpreferences.getString(button1Str, "")); 
Смежные вопросы