Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
sskdroid
8 / 8 / 3
Регистрация: 03.03.2015
Сообщений: 68
#1

В геттере не работает SharedPreferences - Программирование Android

13.08.2015, 19:43. Просмотров 278. Ответов 12
Метки нет (Все метки)

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

Java
1
2
3
4
5
6
    public int getNumberPodRoundA() {
        if(mSettings.contains(LETTER_A)) {
            numberPodRoundA = mSettings.getInt(LETTER_A, 0);
        }
        return numberPodRoundA;
    }
Caused by: java.lang.NullPointerException
at ru.ssk.anagram.MainActivity.getNumberPodRoundA(MainActivity.java:109)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.08.2015, 19:43     В геттере не работает SharedPreferences
Посмотрите здесь:
SharedPreferences Android
Android SharedPreferences
SharedPreferences Android
Android SharedPreferences
SharedPreferences Android
Android SharedPreferences
Сохранение в SharedPreferences Android
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Pablito
2458 / 1903 / 591
Регистрация: 12.05.2014
Сообщений: 6,711
Завершенные тесты: 1
13.08.2015, 19:52     В геттере не работает SharedPreferences #2
а где строчки, которые инициализируют переменную mSettings ?
sskdroid
8 / 8 / 3
Регистрация: 03.03.2015
Сообщений: 68
13.08.2015, 19:54  [ТС]     В геттере не работает SharedPreferences #3
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
public class MainActivity extends Activity {
 
    public static final String APP_PREFERENCES = "my_settings";
    public static final String LETTER_A = "counter1";
    private SharedPreferences mSettings;
    public int numberPodRoundA = 0;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mSettings = getSharedPreferences(APP_PREFERENCES, Context.MODE_PRIVATE);
        ...
Pablito
2458 / 1903 / 591
Регистрация: 12.05.2014
Сообщений: 6,711
Завершенные тесты: 1
13.08.2015, 19:58     В геттере не работает SharedPreferences #4
я так понял, метод getNumberPodRoundA() находится не в классе активити
а где строчки, которые передают ссылку на переменную mSettings от MainActivity в тот класс, где геттер?
sskdroid
8 / 8 / 3
Регистрация: 03.03.2015
Сообщений: 68
13.08.2015, 20:08  [ТС]     В геттере не работает SharedPreferences #5
getNumberPodRoundA() находится В классе активити

еще раз про структуру, есть MainActivity extends Activity где происходит действие игры
есть класс создающий раунды. в этом классе switch (numberPodRound) выбирает типа раунда в зависимости от numberPodRound, который нужно получать от MainActivity при помощи getNumberPodRoundA(). пока не пробую сохранять номер раунда то есть в таком виде -

Java
1
2
3
public int getNumberPodRoundA() {
        return numberPodRoundA;
    }
- все работает. но раунд номер раунда нужно сохранять и потом его читать перед отправкой и когда это все добавляю, то вылазит ошибка именно на строке
Java
1
if(mSettings.contains(LETTER_A)) {
, в дебаггере написано mSettings = null
Pablito
2458 / 1903 / 591
Регистрация: 12.05.2014
Сообщений: 6,711
Завершенные тесты: 1
13.08.2015, 20:16     В геттере не работает SharedPreferences #6
а после этой строки что дебагер говорит?
mSettings = getSharedPreferences(APP_PREFERENCES, Context.MODE_PRIVATE);
sskdroid
8 / 8 / 3
Регистрация: 03.03.2015
Сообщений: 68
13.08.2015, 20:18  [ТС]     В геттере не работает SharedPreferences #7
mSettings = android.app.SharedPreferencesImpl@41ed7bb0
Pablito
2458 / 1903 / 591
Регистрация: 12.05.2014
Сообщений: 6,711
Завершенные тесты: 1
13.08.2015, 20:23     В геттере не работает SharedPreferences #8
а этот "другой" класс, случайно не активити, которая в тот момент находится на экране?
sskdroid
8 / 8 / 3
Регистрация: 03.03.2015
Сообщений: 68
13.08.2015, 20:34  [ТС]     В геттере не работает SharedPreferences #9
нет, обычный класс
Pablito
13.08.2015, 20:38
  #10

Не по теме:

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

sskdroid
8 / 8 / 3
Регистрация: 03.03.2015
Сообщений: 68
13.08.2015, 20:47  [ТС]     В геттере не работает SharedPreferences #11
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
 
 
public class MainActivity extends Activity {
 
    int answerCount = 1;
    String answer;
    public static final String APP_PREFERENCES = "my_settings";
    public static final String APP_CHOICE_ROUND = "counter";
    public static final String LETTER_A = "counter1";
    public SharedPreferences mSettings;
    int numberPodRoundA;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mSettings = getSharedPreferences(APP_PREFERENCES, Context.MODE_PRIVATE);
 
        ImageView rewrite = (ImageView)findViewById(R.id.rewrite);
        rewrite.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, MainActivity.class);
                finish();
                startActivity(intent);
                overridePendingTransition(R.anim.alpha2, R.anim.alpha1);
            }
        });
 
        final Button[] answerArray = {
                (Button) findViewById(R.id.answer0),
                (Button) findViewById(R.id.answer1),
                (Button) findViewById(R.id.answer2),
                (Button) findViewById(R.id.answer3),
                (Button) findViewById(R.id.answer4),
                (Button) findViewById(R.id.answer5),
                (Button) findViewById(R.id.answer6),
        };
        final Button[] questionArray = {
                (Button) findViewById(R.id.question0),
                (Button) findViewById(R.id.question1),
                (Button) findViewById(R.id.question2),
                (Button) findViewById(R.id.question3),
                (Button) findViewById(R.id.question4),
                (Button) findViewById(R.id.question5),
                (Button) findViewById(R.id.question6),
        };
 
 
        SharedPreferences.Editor editor = mSettings.edit();
        int choiceRound = getIntent().getIntExtra("choiceRound", -1);
        if (choiceRound == -1){
            choiceRound = mSettings.getInt(APP_CHOICE_ROUND, 0);
        }
        editor.putInt(APP_CHOICE_ROUND, choiceRound);
        editor.apply();
 
        SimpleRoundFactory s = new SimpleRoundFactory();
        final Round round = s.createRound(choiceRound);
 
        answerArray[0].setText(round.getMainLetter());
        for (int i = round.getLetters(); i < 7; i++){
            answerArray[i].setVisibility(View.GONE);
            questionArray[i].setVisibility(View.GONE);
        }
 
        questionArray[round.getLetters() - 1].setVisibility(View.GONE);
        for (int i = 1; i < round.getLetters(); i++){
            answerArray[i].setBackgroundResource(R.drawable.background_answer_wait);
        }
        for (int i = 0; i < (round.getLetters() - 1); i++){
            questionArray[i].setText(round.getQuestion()[i]);
            questionArray[i].setVisibility(View.VISIBLE);
        }
        answer = round.getMainLetter();
 
        for (int i = 0; i < 7; i++) {
            final int iterator = i;
            questionArray[i].setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    questionArray[iterator].setVisibility(View.GONE);
                    answerArray[answerCount].setBackgroundResource(R.drawable.background_answer);
                    answerArray[answerCount].setText(((Button) v).getText().toString());
                    answerCount++;
                    answer = answer + ((Button) v).getText().toString();
                    if (answer.equals(round.getAnswer())){
                        
                        numberPodRoundA = mSettings.getInt(LETTER_A, 0);
                        numberPodRoundA++;
                        SharedPreferences.Editor editor = mSettings.edit();
                        editor.putInt(LETTER_A, numberPodRoundA);
                        editor.apply();
 
                        Intent intent = new Intent(MainActivity.this, MainActivity.class);
                        finish();
                        startActivity(intent);
                        overridePendingTransition(R.anim.alpha2, R.anim.alpha1);
                        
                        Toast toast = Toast.makeText(getApplicationContext(),"Верно!", Toast.LENGTH_SHORT);
                        toast.show();
                    }
                }
            });
        }
 
    }
 
    public int getNumberPodRoundA() {
        if(mSettings.contains(LETTER_A)) {
            numberPodRoundA = mSettings.getInt(LETTER_A, 0);
        }
        return numberPodRoundA;
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import java.util.ArrayList;
 
/**
 * Created by ssk on 05.08.2015.
 */
public class Aletter extends Round {
 
    int letters;
    int numberPodRound;
    String mainLetter = "А";
    String answer;
    String[] question;
    ArrayList<String> questionInflate = new ArrayList<>();
 
    public void numberPodRound(){
        MainActivity factory = new MainActivity();
        numberPodRound = factory.getNumberPodRoundA();
        switch (numberPodRound){
            case 0:
                letters = 3;
                questionInflate.add("Л");
                questionInflate.add("У");
                answer = "АУЛ";
                break;
            case 1:
                questionInflate.add("А");
                questionInflate.add("Р");
                questionInflate.add("У");
                letters = 4;
                answer = "АУРА";
                break;
        }
    }
 
    public String getMainLetter(){
        return mainLetter;
    }
 
    public int getLetters(){
        numberPodRound();
        return letters;
    }
 
    public String[] getQuestion(){
        numberPodRound();
        question = questionInflate.toArray(new String[questionInflate.size()]);
        return question;
    }
 
    public String getAnswer(){
        numberPodRound();
        return answer;
    }
}
Pablito
2458 / 1903 / 591
Регистрация: 12.05.2014
Сообщений: 6,711
Завершенные тесты: 1
13.08.2015, 21:25     В геттере не работает SharedPreferences #12
вот так делать вообще не надо
Java
1
MainActivity factory = new MainActivity();
это вообще непонятно зачем
Java
1
Intent intent = new Intent(MainActivity.this, MainActivity.class);
можно в конструктор класса Round передавать mSettings и в самом классе запоминать ее
ps: код стремный
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.08.2015, 21:39     В геттере не работает SharedPreferences
Еще ссылки по теме:
Android Array в SharedPreferences
Android SharedPreferences, HashMap
Начальное значение SharedPreferences Android
Android SharedPreferences putString и getString
Android SharedPreferences в другом классе

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
sskdroid
8 / 8 / 3
Регистрация: 03.03.2015
Сообщений: 68
13.08.2015, 21:39  [ТС]     В геттере не работает SharedPreferences #13
Цитата Сообщение от Паблито Посмотреть сообщение
это вообще непонятно зачем
Код Java(TM) 2 Platform Standard Edition 5.0Выделить код
1
Intent intent = new Intent(MainActivity.this, MainActivity.class);
перезагружает активность с новыми параметрами

Цитата Сообщение от Паблито Посмотреть сообщение
можно в конструктор класса Round передавать mSettings и в самом классе запоминать ее
попробую

Цитата Сообщение от Паблито Посмотреть сообщение
ps: код стремный
понятно, что стремный, сам в шоке от него) ООП месяц изучать пытаюсь и какие-то штуки со множеством параметров не особо представляю как делать
Yandex
Объявления
13.08.2015, 21:39     В геттере не работает SharedPreferences
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru