Урок 71. Preferences как настройки приложения. PreferenceActivity

Обсуждение уроков
Tanya
Сообщения: 2
Зарегистрирован: 23 янв 2013, 18:25

Re: Урок 71. Preferences как настройки приложения. Preferenc

Сообщение Tanya » 23 янв 2013, 18:35

Здравствуйте! Подскажите, пожалуйста, как вывести название выбранного рингтона (используется RingtonePreference)? В данном случае, при использовании, например,
sPref = PreferenceManager.getDefaultSharedPreferences(this);
String sp = sPref.getString("ringtone_pref", "");
будет выводиться ссылка вида content://settings/system/ringtone.
Заранее спасибо.

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 71. Preferences как настройки приложения. Preferenc

Сообщение damager82 » 24 янв 2013, 13:21

Есть метод getRingtone (http://developer.android.com/reference/ ... etRingtone(android.content.Context, android.net.Uri))
Получите Ringtone.
А потом есть метод getTitle (http://developer.android.com/reference/ ... t.Context)), который вернет название.

Правда, это все мои догадки. Я не пробовал так делать )

Посмотрите еще эту тему - viewtopic.php?f=37&t=161
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Tanya
Сообщения: 2
Зарегистрирован: 23 янв 2013, 18:25

Re: Урок 71. Preferences как настройки приложения. Preferenc

Сообщение Tanya » 24 янв 2013, 13:33

Спасибо!

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 71. Preferences как настройки приложения. Preferenc

Сообщение Mikhail_dev » 24 янв 2013, 15:21

Что-то не пойму как получить значения настроек. Есть активити. Есть сервис, в другом процессе. Как получить значения настроек, если при getDefaultSharedPreferense нам надо указать контекст? getApplicationContext не дало нужного результата. Как вытащить значения ?

Аватара пользователя
Finch
Сообщения: 439
Зарегистрирован: 16 июл 2012, 21:37

Re: Урок 71. Preferences как настройки приложения. Preferenc

Сообщение Finch » 24 янв 2013, 15:53

Код: Выделить всё

SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(context);
CEO of a company R.id.team

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 71. Preferences как настройки приложения. Preferenc

Сообщение KamiSempai » 24 янв 2013, 15:56

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

Код: Выделить всё

347    public static SharedPreferences getDefaultSharedPreferences(Context context) {
348        return context.getSharedPreferences(getDefaultSharedPreferencesName(context),
349                getDefaultSharedPreferencesMode());
350    }
351
352    private static String getDefaultSharedPreferencesName(Context context) {
353        return context.getPackageName() + "_preferences";
354    }
355
356    private static int getDefaultSharedPreferencesMode() {
357        return Context.MODE_PRIVATE;
358    }
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 71. Preferences как настройки приложения. Preferenc

Сообщение Mikhail_dev » 24 янв 2013, 18:02

Да, я знаю про это дело, о чем вы написали. Собственно это я и пробовал, но не получалось.
Я немного побуду сейчас в роли Девида Блейна =)
Решение нашел, но в чем проблема, до сих пор не пойму. Напомню, что сервис в другом процессе, но приложение тоже. В активити всё хорошо обновляется, поэтому я её не беру в учёт. Итак есть сервис

Код: Выделить всё

    public void onCreate() {
        super.onCreate();
        mPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
   }
    
    private void updateSettings() {
    	minZoom = Integer.parseInt(mPreferences.getString("preload_maps_min_zoom_key", "11"));
    	whenUseGsm = Integer.parseInt(mPreferences.getString("when_use_gsm_key", "0"));
    	Log.d("sample", "minZoom "+minZoom);
    	Log.d("sample", "when use gsm"+whenUseGsm);
    }
    private void createSettingsReceiver() { 
        settingsReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
            	final String action = intent.getAction();
            	if (action.equals(App.I_SETTINGS_CHANGED)) { 
            		updateSettings();
            	}
                
            }
        };
        IntentFilter intentFilter = new IntentFilter(App.I_SETTINGS_CHANGED);
        registerReceiver(settingsReceiver, intentFilter);
    }
Бродкаст стоит на слушателе в активности настроек. Т.е. как они сменились, так кидается бродкаст.
Как вы думаете, будет ли работать? Если да, то вы ошибаетесь. Нифига такое решение не работает. Выводятся дефолтные настройки для ключей.
Изменим немного updateSettings на вот так.

Код: Выделить всё

    private void updateSettings() {
    	minZoom = Integer.parseInt(mPreferences.getString("preload_maps_min_zoom_key", "11"));
    	whenUseGsm = Integer.parseInt(PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getString("when_use_gsm_key", "0"));
    	Log.d("sample", "minZoom "+minZoom);
    	Log.d("sample", "when use gsm"+whenUseGsm);
    }
Т.е. мы получаем тот же SharedPreferences, что получали в onCreate, но через статический класс. Но для одного ключа! В итоге треш получим, а именно:
Второе значение изменяется на ура, но вот первое...
По логике оно не должно меняться, коль в первом моем показанном варианте ничего не менялось, но оно принимает своё прошлое выбранное значение! Поясню.
Допустим там выбор buttons в очередь и равны они 1 2 3 4 5
Дефолтное 1. Нажимаем на 2. На экран выведется один. Далее нажмем 3, на экран выведется 2 !! Нажмем 5, выведется 3, нажмем 1, выведется 5. Вот как это понимать?
А вот так вот работает

Код: Выделить всё

    private void updateSettings() {
             mPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
    	minZoom = Integer.parseInt(mPreferences.getString("preload_maps_min_zoom_key", "11"));
    	whenUseGsm = Integer.parseInt(mPreferences.getString("when_use_gsm_key", "0"));
    	Log.d("sample", "minZoom "+minZoom);
    	Log.d("sample", "when use gsm"+whenUseGsm);
    }
Вот такие вот дела.

А еще меня сегодня убило то, что в ListPreferences нельзя выводить ничто другое, кроме как массивов типа String. Убил пол дня на поиск проблемы, откуда NullPointerException там. Вот про эту багу, если кому интересно. http://code.google.com/p/android/issues/detail?id=2096

xottabut
Сообщения: 5
Зарегистрирован: 12 ноя 2012, 22:48

Re: Урок 71. Preferences как настройки приложения. Preferenc

Сообщение xottabut » 06 фев 2013, 23:29

Скажите а как в PreferenceActivity сделать свой стиль например задний фон и цвет текста?

Аватара пользователя
dens
Сообщения: 47
Зарегистрирован: 03 фев 2013, 00:14

Re: Урок 71. Preferences как настройки приложения. Preferenc

Сообщение dens » 07 фев 2013, 23:50

Вот тут глянь, может, поможет: viewtopic.php?f=25&t=912

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 71. Preferences как настройки приложения. Preferenc

Сообщение rezak90 » 08 фев 2013, 00:29

xottabut писал(а):Скажите а как в PreferenceActivity сделать свой стиль например задний фон и цвет текста?
смотрите нативную тему андроида, там есть атрибуты preferenceScreenStyle, preferenceFragmentStyle, preferenceCategoryStyle и т.д., в зависимости от того что вам нужно такой стиль и переопределяете
R.id.team
Политика на форуме запрещена

Grief89
Сообщения: 2
Зарегистрирован: 10 ноя 2012, 20:33

Re: Урок 71. Preferences как настройки приложения. Preferenc

Сообщение Grief89 » 09 фев 2013, 22:22

Скажите,
выполнила тестовый пример из урока, но при возврате из меню у меня повторно выполняется OnCreate() и только потом OnResume(). Может где-то надо специально указывать такое поведение?
Т.е. выполнение OnCreate каждый раз при выходе из меню это нормально или нет?

Sharp
Сообщения: 2
Зарегистрирован: 12 фев 2013, 16:59

Re: Урок 71. Preferences как настройки приложения. Preferenc

Сообщение Sharp » 13 фев 2013, 17:14

Есть PreferenceActivity из которой честно вызывается из preferences.xml набор настроек. Все там отлично меняется, но хочется при возврате в экрану PreferenceActivity отобразить сделанные настройки прямо в списке , например в опции Summary. Но вот беда .. На какое событие повесить setSummary ? Варианты c onResume не прокатывают, поскольку мы находимся в теле выполнения PreferenceActivity. Каким событием отловить выход из диалога изменения опции ?

Аватара пользователя
dens
Сообщения: 47
Зарегистрирован: 03 фев 2013, 00:14

Re: Урок 71. Preferences как настройки приложения. Preferenc

Сообщение dens » 14 фев 2013, 23:45

Я, когда с таким сталкивался, менял состояние вьюшек странице в onPreferenceChange.
Или я не правильно понял вопрос?

Digetix
Сообщения: 117
Зарегистрирован: 12 окт 2012, 15:31

Re: Урок 71. Preferences как настройки приложения. Preferenc

Сообщение Digetix » 20 мар 2013, 23:26

Здравствуйте. Делал по вашему примеру с onResume. С вашим примером понятно. Но у меня главное активити карта, на которую маркеры налаживаются с базы в интернете. В Настройках есть выбор радиуса показа точек. Так вот я делал по вашему примеру с onResume и получается [на реальном устройстве], что когда экран тухнет, то происходит onResume, если программу свернуть, то снова onResume, это как бы правильно, но постоянно идёт запрос с базу. Подскажите, пожалуйста, как сделать, чтоб изменение настроек применялось только после их изменения? А не при изменении фокуса.
Код активити с настройками:

Код: Выделить всё

import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.PreferenceActivity;

public class ActivityPref extends PreferenceActivity{
	
	ListPreference prefList, prefList2;
	
	@SuppressWarnings("deprecation")
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		addPreferencesFromResource(R.xml.settings);
		
		    prefList = (ListPreference) findPreference("prefOne");
	        prefList.setDefaultValue(prefList.getEntryValues()[1]);
	        String ss = prefList.getValue();
	        if (ss == null) {
	            prefList.setValue((String)prefList.getEntryValues()[1]);
	            ss = prefList.getValue();
	        }
	        prefList.setSummary(prefList.getEntries()[prefList.findIndexOfValue(ss)]);

	        prefList.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
	            @Override
	            public boolean onPreferenceChange(Preference preference, Object newValue) {
	                prefList.setSummary(prefList.getEntries()[prefList.findIndexOfValue(newValue.toString())]);
	                return true;
	            }

				
	        }); 
	        
	        prefList2 = (ListPreference) findPreference("prefTwo");
	        prefList2.setDefaultValue(prefList2.getEntryValues()[2]);
	        String ss2 = prefList2.getValue();
	        if (ss2 == null) {
	            prefList2.setValue((String)prefList2.getEntryValues()[2]);
	            ss2 = prefList2.getValue();
	        }
	        prefList2.setSummary(prefList2.getEntries()[prefList2.findIndexOfValue(ss2)]);

	        prefList2.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
	            @Override
	            public boolean onPreferenceChange(Preference preference, Object newValue) {
	                prefList2.setSummary(prefList2.getEntries()[prefList2.findIndexOfValue(newValue.toString())]);
	                return true;
	            }

				
	        });	       
	    }

	}

xr0m
Сообщения: 131
Зарегистрирован: 06 апр 2013, 14:01

Re: Урок 71. Preferences как настройки приложения. Preferenc

Сообщение xr0m » 14 апр 2013, 22:03

Ребят, андроид генерирует сам окно настроек(Добавить Android activity > Settings activity). Так во там можно заметить, что метод addPreferencesFromResource(R.xml.pref); вызывается не в onCreate(),а в onPostCreate()

Кто-нибудь разбирался в этом? Из некоторых объяснений выходит, что метод обрабатывается после onCreate() ,но до onResume(). Может он лучше подходит, чем "восстановление"?
Called when activity start-up is complete (after onStart() and onRestoreInstanceState(Bundle) have been called). Applications will generally not implement this method; it is intended for system classes to do final initialization after application code has run.
Из описания ясно, что метод более для системы. А зачем же тогда он его генерирует? Как-то не понятно.

xr0m
Сообщения: 131
Зарегистрирован: 06 апр 2013, 14:01

Re: Урок 71. Preferences как настройки приложения. Preferenc

Сообщение xr0m » 15 апр 2013, 00:37

Еще один вопрос. Если нажать кнопку вернуться с настроек, то главный активити просто получает фокус. А если тапнуть по стрелке наверху у названия, то главный активити вызывает метод Создать, и все сбрасывается. Как поправить?

UPDATE 1: Сам себе и отвечу

Код: Выделить всё

       @Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case android.R.id.home:
			finish(); //завершаем данный активити
			return true; //не посылаем событие дальше
		}
		return super.onOptionsItemSelected(item);
	}
Идея в том, что если были изменены настройки, пересоздаем главный активити, а если не были, просто возвращаемся назад. Для этого только осталось добавить флаг, проверку и действия.

Аватара пользователя
-Alex-
Сообщения: 30
Зарегистрирован: 26 ноя 2013, 09:40

Re: Урок 71. Preferences как настройки приложения. Preferenc

Сообщение -Alex- » 19 дек 2013, 14:19

Добрый день!

Подскажите, пожалуйста, по следующему вопросу:
- есть у приложения список настроек;
- при установке и запуске приложения - оно вылетает при попытке зайти в главное активити. Но! Если перед входом в главное активити зайти в настройки и "потыкать" там, то после этого приложение не вылетает.
Есть такое ощущение, что необходим метод, который при запуске главного активити, должен пройтись по настройкам и считать их.
Подскажите, пожалуйста, есть ли такой метод или надо этот вопрос решать по другому как-то?

Заранее спасибо!

Вот как я использую настройки:

Код: Выделить всё


sp = PreferenceManager.getDefaultSharedPreferences(this);

protected void onResume() {

		listValue = sp.getString("list", "не выбрано");
		Log.d(LOG_TAG, "значение List = " + listValue);
		listValueInt = Integer.parseInt(listValue);
		Log.d(LOG_TAG, "значение ListInt = " + listValueInt);
		listValueCount = sp.getString("list2", "не выбрано");
		Log.d(LOG_TAG, "значение listValueCount = " + listValueCount);
		listValueIntCount = Integer.parseInt(listValueCount);
		Log.d(LOG_TAG, "значение listValueIntCount = " + listValueIntCount);
		listValueText = sp.getString("list3", "не выбрано");
		Log.d(LOG_TAG, "значение listValueText = " + listValueText);
		listValueIntText = Integer.parseInt(listValueText);
		Log.d(LOG_TAG, "значение listValueIntText = " + listValueIntText);
		
		super.onResume();
	}

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 71. Preferences как настройки приложения. Preferenc

Сообщение Mikhail_dev » 19 дек 2013, 16:49

Дайте лог с ошибкой.
Последний раз редактировалось Mikhail_dev 19 дек 2013, 17:00, всего редактировалось 1 раз.

Аватара пользователя
-Alex-
Сообщения: 30
Зарегистрирован: 26 ноя 2013, 09:40

Re: Урок 71. Preferences как настройки приложения. Preferenc

Сообщение -Alex- » 19 дек 2013, 16:58

no-- писал(а):Дайте с ошибкой.
Что именно дать с ошибкой?


Ответить