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

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

Войти
Регистрация
Восстановить пароль
 
vladbim
0 / 0 / 0
Регистрация: 14.01.2015
Сообщений: 4
#1

При повторном запуске приложения не загружаются сохраненные значения SharedPreferences - Программирование Android

14.01.2015, 15:11. Просмотров 645. Ответов 5
Метки нет (Все метки)

Всем привет. сразу пишу, что андроид начал изучать недавно. В общем, в программке надо реализовать сохранение введенного или выбранного из контактов номера телефона. При первом запуске пользователь указывает номер. При последующих, вызывается другой активити SecondActivity. Вот код MainActivity
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
public class MainActivity extends ActionBarActivity {
 
    private static final int CONTACT_PICK_RESULT = 666;
    private static final String LOG_TAG = "my_tag";
    private TextView mNumber;
    public static final String app_preferences="settings";
    public static final String Tel_Number = "Telephone";
    public static final String Contact_Name = "Contact Name";
    private static SharedPreferences mSettings;
    private String mContactId;
    private String mPhoneNumber;
    private String mContactName;
    private Intent intent = new Intent();
 
 
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mSettings = getSharedPreferences(app_preferences, Context.MODE_PRIVATE);
    }
 
@Override
    protected void onPause() {
        super.onPause();
 
        SharedPreferences.Editor editor = mSettings.edit();
        editor.putString(Tel_Number,mPhoneNumber);
//        editor.putString(Contact_Name,mContactName);
        editor.apply();
    }
 
    @Override
    protected void onResume() {
        super.onResume();
 
        if(mSettings.contains(Tel_Number)) {
            Toast.makeText(this, mSettings.getString(Tel_Number, ""),Toast.LENGTH_LONG).show();
            intent.setClass(this, SecondActivity.class);
            startActivity(intent);
        }
        else {
            setContentView(R.layout.activity_main);
        }
    }
 
    @Override
    protected void onStop() {
        super.onStop();
        onPause();
    }
 
    public static boolean checkNum(String num)  {
 
        if(  num.length() >10 ||  num.length() <9)
        {
            return false;
        }
        else
        {
            return true;
        }
    }
 
    public void onClick(View view) {
        mNumber=(TextView)findViewById(R.id.editText1);
        mPhoneNumber=mNumber.getText().toString().trim();
        try {
 
            if(checkNum(mPhoneNumber))
            {
                mPhoneNumber = "38"+mNumber.getText().toString();
                onPause();
                onResume();
 
            }
            else
            {
                throw new Exception("Неправильно указан номер телефона");
            }
 
        }
        catch (Exception e)
        {
            Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
        }
    }
 
    public void  pickPhone(View view) {
        Intent contactPickerIntent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
        startActivityForResult(contactPickerIntent, CONTACT_PICK_RESULT);
    }
 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            switch (requestCode) {
                case CONTACT_PICK_RESULT:
                    Uri contactData = data.getData();
                    Cursor c =  getContentResolver().query(contactData, null, null, null, null);
                    if (c.moveToNext()) {
                        mContactId = c.getString(c.getColumnIndex(ContactsContract.Contacts._ID));
                        mContactName = c.getString(c.getColumnIndexOrThrow(
                                ContactsContract.Contacts.DISPLAY_NAME));
 
                        String hasPhone = c.getString(c.getColumnIndex(
                                ContactsContract.Contacts.HAS_PHONE_NUMBER));
 
                        Log.d(LOG_TAG, "name: " + mContactName);
                        Log.d(LOG_TAG, "hasPhone:" + hasPhone);
                        Log.d(LOG_TAG, "contactId:" + mContactId);
 
                        // если есть телефоны, получаем и выводим их
                        if (hasPhone.equalsIgnoreCase("1")) {
                            Cursor phones = getContentResolver().query(
                                    ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                                    null,
                                    ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ mContactId,
                                    null,
                                    null);
 
                            while (phones.moveToNext()) {
                                mPhoneNumber = phones.getString(phones.getColumnIndex(
                                        ContactsContract.CommonDataKinds.Phone.NUMBER));
                                Log.d(LOG_TAG, "телефон:" + mPhoneNumber);
                            }
                            phones.close();
                        }
 
                    }
                    break;
            }
            onPause();
            onResume();
        } else {
            Log.d(LOG_TAG, "ERROR");
            Toast.makeText(this, "Ошибка", Toast.LENGTH_LONG).show();
        }
    }
}
Вот SecondActivity, от сюда от может войти в настройки и изменить номер.
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
public class SecondActivity extends ActionBarActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }
 
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        Intent intent = new Intent();
        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            intent.setClass(this, PrefActivity.class);
            startActivity(intent);
            return true;
        }
 
        return super.onOptionsItemSelected(item);
 
    }
 
}
И тут начинается самое интересное.
Если мы прогу запускаем первый раз, то только что указанный номер(в мейнактивити) без проблем отображается в настройках.
Если же закрыть программу, и открыть второй раз, то он в настройках уже не отображается. Но в файле настроек он есть, так как прога проверяет при открытии,его наличие в методе onResume() класса MainActivity и выводит в Тост.
Если же закрыть прогу и еще раз открыть, то номер не отображается даже в тосте((
В чем может быть дело?
Вот код Настроек PrefActivity
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
public  class PrefActivity extends PreferenceActivity implements Preference.OnPreferenceChangeListener {
    private static  SharedPreferences Sett;
 
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        PreferenceScreen rootScreen = getPreferenceManager().createPreferenceScreen(this);
        setPreferenceScreen(rootScreen);
        Sett= getSharedPreferences(MainActivity.app_preferences, Context.MODE_PRIVATE);
 
        EditTextPreference etp = new EditTextPreference(this);
        etp.setKey("Телефон");
        etp.setTitle("Изменить номер телефона");
        etp.setSummary(getNum());
        etp.setOnPreferenceChangeListener(this);
        rootScreen.addPreference(etp);
    }
 
    private String getNum()
    {
        if(Sett.contains(MainActivity.Tel_Number)) {
         return   Sett.getString(MainActivity.Tel_Number, "");
        }
        else
        return "Error";
    }
 
    public boolean onPreferenceChange(Preference preference, Object newValue)
    {
        try {
            if (MainActivity.checkNum(newValue.toString())) {
 
                preference.setSummary(newValue.toString());
                SharedPreferences.Editor editor = Sett.edit();
                editor.putString(MainActivity.Tel_Number, newValue.toString());
                editor.apply();
            }
            else
            {
                throw new Exception("Неправильно указан номер телефона");
            }
 
        }
        catch (Exception e)
        {
            Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
        }
        return true;
    }
 
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.01.2015, 15:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос При повторном запуске приложения не загружаются сохраненные значения SharedPreferences (Программирование Android):

При переносе приложения на карту памяти где хранятся SharedPreferences, SQLite базы и тп ? - Программирование Android
Где хранятся настройки SharedPreferences, SQLite базы и тд? Нужно ли что то дополнительно прописывать или при переносе на карту памяти...

SharedPreferences стираются после перезапуска приложения - Программирование Android
Доброго времени суток. В моем приложении пробую хранить его данные конфигурации (адрес сервера , идентификатор пользователя) при помощи...

Ошибка при запуске приложения - Программирование Android
Сегодня запускал приложение, оно не запускается, выдает такую ошибку 08-17 18:39:37.012 10830-10830/? E/adsprpc:...

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

Ошибка при запуске приложения - Программирование Android
Добрый день! Проблема заключается в следующем, после запуска приложения в эмуляторе вылетает диалоговое окно с сообщением...

Ошибка при запуске простого приложения - Программирование Android
При запуске простейшего приложения вот что выводится в консоль: ------------------------------ Android Launch! adb is running...

5
name?
198 / 169 / 18
Регистрация: 01.06.2010
Сообщений: 371
Завершенные тесты: 1
14.01.2015, 15:46 #2
не хватает commit'a у вас когда сейвите запись
Java
1
2
3
4
 public void setStringConfig(ESetting key, String value){
        editor.putString(key.getValue(), value);
        editor.commit();
   }
0
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
14.01.2015, 15:55 #3
name?, зато есть apply()

Добавлено через 4 минуты
vladbim, что-то как-то мне не по душе отэти прямые вызовы
Java
1
2
onPause();
onResume();
Нехорошо как-то...
0
vladbim
0 / 0 / 0
Регистрация: 14.01.2015
Сообщений: 4
14.01.2015, 17:09  [ТС] #4
Armagedo, вы про метод onClick? Ну переписать едитор и интент несложно, только толку с этого.. Я не могу понять почему оно при первом и втором запуске еще работает, а при последующих вообще не может достать инфу из файла
0
Вложения
Тип файла: rar project.rar (4.79 Мб, 0 просмотров)
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
14.01.2015, 17:44 #5
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от vladbim Посмотреть сообщение
Я не могу понять почему оно при первом и втором запуске еще работает, а при последующих вообще не может достать инфу из файла
потому что onPause() и onResume() - это не просто методы, это коллбэки, методы в ответ на определённые события в "жизни" активити, не зависящие от того вызовете вы их явно где-то или нет, они сами "вызываются" в ответ на опредеелнный момент "жизни" активити.

Вот ваш код
Java
1
2
3
4
5
6
7
8
9
@Override
    protected void onPause() {
        super.onPause();
 
        SharedPreferences.Editor editor = mSettings.edit();
        editor.putString(Tel_Number,mPhoneNumber);
//        editor.putString(Contact_Name,mContactName);
        editor.apply();
    }
где

mPhoneNumber = "38"+mNumber.getText().toString();
Смотрим, что вы делаете.
В первый раз, вы вводите в поле mNumber текст, жмёте клик, вызываете onPause().
Всё хорошо.

Закрыли приложение, открыли.
Сработал onResume.

НО в поле mNumber НЕТ никакого текста.

В какой-то момент (скрытие с экрана, выход) срабатывает onPause() и что происхдит?

Правильно, в sharedpreferences загоняется значение mPhoneNumber, которого НЕТ.

Так понятней?

Перенесите из onPause() всё в ваш onClick() и больше никогда так не делайте

И перестаньте лезть так нагло в "жизнь" активити - инициировать ее личные "события" там, где это совершенно не нужно - напишите свой отдельный метод и вызывайте раз уж вам он очень нужен
1
vladbim
0 / 0 / 0
Регистрация: 14.01.2015
Сообщений: 4
14.01.2015, 18:52  [ТС] #6
Цитата Сообщение от Armagedo Посмотреть сообщение
Перенесите из onPause() всё в ваш onClick() и больше никогда так не делайте
Сделал, работает, спасибо Понял ошибку, влез туда, куда нет нужды. Подумалось просто, если сделать так, то если приложение свернется, допустим случайно, то данные сохранятся вызовом onPause. По сути они и так сохранятся, по тыку на кнопку

Добавлено через 43 минуты
Можно ли изменить диалоговое окно в EditTextPreference, например добавить перед полем ввода свой текст и закрепить его?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2015, 18:52
Привет! Вот еще темы с ответами:

При запуске приложения появляется клавиатура - Программирование Android
В приложении есть текстовое поле EditText в xml файле, а ниже находятся кнопки. При запуске приложения почему-то курсор сразу ставится в...

При запуске приложения подвисает ui поток - Программирование Android
Всем привет! Есть большой проект, при запуске на секунд 20 зависает, тоесть активити отрисовывается, но все кнопки и прочие элементы не...

Обучение при первом запуске приложения - Программирование Android
Здравствуйте! Подскажите пожалуйста как можно сделать обучалку в приложении. Например фон затемняется, а нужный участок остается светлым и...

При запуске приложения выдается ошибка - Программирование Android
запускаю приложение включается заставка а потом пишет ошибку 05-11 16:19:06.775: E/AndroidRuntime(537): FATAL EXCEPTION: main 05-11...


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

Или воспользуйтесь поиском по форуму:
6
Yandex
Объявления
14.01.2015, 18:52
Ответ Создать тему
Опции темы

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