2015-07-09 4 views
1

Я пишу приложение, в котором я должен сохранить состояние активности. У меня вопрос и несколько кнопок в действии. Когда пользователь нажимает на правильный ответ, все события происходят одновременно.Сохраните состояние активности с SharedPreferences

1.The телефон вибрирует.

2. Появляется изображение.

3. Кнопки становятся отключенными.

Мне нравится сохранять изображение и статус кнопок, но когда я нажимаю на кнопку «Назад» и снова открываю действие, все идет, и я должен начинать с самого начала. Я использую SharedPrefernces, чтобы сохранить их, но он не работает. Я создал логический тип, который является ложным в начале. Когда пользователь выбирает правильный ответ, логическое значение становится истинным, а если оно истинно, события происходят. Я сохраняю этот истинный статус в методе onStop, и я использую Toast, который показывает мне состояние булева. Когда я выбираю правильный ответ, Toast показывает «true», и когда я снова открываю действие, он показывает «false». Очевидно, что попытка сохранить «истинный» статус плоха, но я использую правильный тип хранилища, чтобы сохранить изображение и статус кнопок? Так что я боюсь, чтобы сохранить статус с SharedPreferences.

Если у кого-то есть идея, как это сделать, ответьте! :)

скопировать мой код:

private static final String KEYFIRST = "KEYFIRST"; 
private static final String DB_INIT = "DB_INIT"; 
String requested_word = "gol"; 
final Button buttons[] = new Button[3]; 
final Button betu[] = new Button[3]; 
final String[] letters = new String[3]; 
final int[] arr = new int[3]; 
boolean done = false; 
ImageView imageview2; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Log.d("TEST2", "CREATE3"); 
} 

@Override 
protected void onStart() { 
    super.onStart(); 
    Log.d("TEST2", "STRAT3"); 
    SharedPreferences sp = getSharedPreferences(DB_INIT, MODE_PRIVATE); 
    Boolean state = sp.getBoolean(KEYFIRST, done); 
    Toast.makeText(getApplicationContext(), ""+done, Toast.LENGTH_LONG).show(); 
} 

@Override 
protected void onResume() { 

    buttons[0] = (Button) findViewById(R.id.valaszelso); 
    buttons[1] = (Button) findViewById(R.id.valaszmasodik); 
    buttons[2] = (Button) findViewById(R.id.valaszharmadik); 

    betu[0] = (Button) findViewById(R.id.elso); 
    betu[1] = (Button) findViewById(R.id.masodik); 
    betu[2] = (Button) findViewById(R.id.harmadik); 

    letters[0] = betu[0].getText().toString(); 
    letters[1] = betu[1].getText().toString(); 
    letters[2] = betu[2].getText().toString(); 

    imageview2 = (ImageView) findViewById(R.id.imageview2); 

    for (int i = 0; i < 3; i++) { 
     arr[i] = 0; 
    } 

    betu[0].setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      for (int i = 0; i < 3; i++) { 
       if (arr[i] == 0) { 
        arr[i] = 1; 
        buttons[i].setText(betu[0].getText().toString()); 
        betu[0].setVisibility(View.INVISIBLE); 
        break; 
       } 

      } 
     } 
    }); 
    betu[1].setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      for (int i = 0; i < 3; i++) { 
       if (arr[i] == 0) { 
        arr[i] = 1; 
        buttons[i].setText(betu[1].getText().toString()); 
        betu[1].setVisibility(View.INVISIBLE); 
        break; 
       } 

      } 
     } 
    }); 
    betu[2].setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      for (int i = 0; i < 3; i++) { 
       if (arr[i] == 0) { 
        arr[i] = 1; 
        buttons[i].setText(betu[2].getText().toString()); 
        betu[2].setVisibility(View.INVISIBLE); 
        break; 
       } 
       if (arr[3 - 1] == 1) { 
        test(); 
       } 
      } 
     } 

     private void test() { 
      String word = ""; 
      for (int i = 0; i < 3; i++) { 
       word += buttons[i].getText().toString(); 
      } 
      if (word.equals(requested_word)) { 
        Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); 
        v.vibrate(500); 
        done = true; 
        Log.d("TEST2","set true"); 
        if(done == true){ 
        for (int j = 0; j < 3; j++) { 
         buttons[j].setEnabled(false); 
         betu[j].setEnabled(false); 
         imageview2.setVisibility(View.VISIBLE); 
        } 
        Toast.makeText(getApplicationContext(), ""+done, Toast.LENGTH_LONG).show(); 
        } 
      } 
     } 
    }); 
    super.onResume(); 
    Log.d("TEST2", "RESUME3"); 
} 

@Override 
protected void onStop() { 
    super.onStop(); 

    SharedPreferences sp = getSharedPreferences(DB_INIT, MODE_PRIVATE); 
    Editor et = sp.edit(); 
    et.putBoolean(KEYFIRST, done); 
    et.commit(); 
    if(done == true){ 
     Log.d("TEST2","true saved"); 
    } 
    Log.d("TEST2", "STOP3"); 
} 

}

ответ

0

При нажатии кнопки назад, действие по умолчанию он выполняет это, чтобы закончить свою деятельность.

Так что если вы используете sharedPreferences (лично я предпочитаю использовать SqliteDB).

Ваша проблема может быть, потому что вы не указываете свой Aplication контекст, поэтому я рекомендую вам изменить эти строки:

SharedPreferences sp = getSharedPreferences(DB_INIT, MODE_PRIVATE); 
Editor et = sp.edit(); 
et.putBoolean(KEYFIRST, done); 
et.commit(); 

Для этого:

 SharedPreferences sp=getApplicationContext().getSharedPreferences(DB_INIT, Context.MODE_PRIVATE); 
     SharedPreferences.Editor edit=sp.edit(); 
     edit.putBoolean(KEYFIRST, done); 
     edit.commit(); 

и эти строки:

SharedPreferences sp = getSharedPreferences(DB_INIT, MODE_PRIVATE); 
Boolean state = sp.getBoolean(KEYFIRST, done); 

к настоящему времени:

SharedPreferences shared = getApplicationContext().getSharedPreferences(DB_INIT, Context.MODE_PRIVATE); 
     response = (shared.getBoolean(KEYFIRST, done)); 

Ваш Ошибка:

@Override 
protected void onStart() { 
    super.onStart(); 
    Log.d("TEST2", "STRAT3"); 
    SharedPreferences sp = getSharedPreferences(DB_INIT, MODE_PRIVATE); 
    Boolean state = sp.getBoolean(KEYFIRST, done); 
    Toast.makeText(getApplicationContext(), ""+done, Toast.LENGTH_LONG).show(); 
} 

Вы показываете в вашем Тост вар Done, что изначально неверно, вы должны показать состояние вар ....

как это:

@Override 
protected void onStart() { 
super.onStart(); 
Log.d("TEST2", "STRAT3"); 
SharedPreferences sp = getSharedPreferences(DB_INIT, MODE_PRIVATE); 
Boolean state = sp.getBoolean(KEYFIRST, done); 
Toast.makeText(getApplicationContext(), ""+state, Toast.LENGTH_LONG).show(); 

}

в основном проблема заключается в том, что контекст вы спасаете SharedPr eferences. С уважением.

+0

Спасибо за ваш ответ! К сожалению, ваш код для меня не работает.То же самое, когда ответ в порядке, тост показывает мне правду, и когда я снова его открываю, логическое значение false, и изображение исчезло. Можете ли вы сказать мне, почему вы предпочитаете SqliteDB? Я прочитал, что он используется для данных структуры. –

+0

ОК, почему не работает, это дает вам некоторую ошибку? если он, вы могли бы поделиться своим логарифмом, чтобы проверить, код, которым я пользуюсь, я использую в некоторых проектах и ​​работает, поэтому давайте посмотрим, почему не –

+0

Проверьте это решение тоже: http://stackoverflow.com/questions/151777/saving- activity-state-in-android –

Смежные вопросы