Страница 2 из 3

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

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

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

Добавлено: 24 янв 2013, 13:21
damager82
Есть метод 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

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

Добавлено: 24 янв 2013, 13:33
Tanya
Спасибо!

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

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

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

Добавлено: 24 янв 2013, 15:53
Finch

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

SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(context);

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

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

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

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    }

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

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

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

    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

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

Добавлено: 06 фев 2013, 23:29
xottabut
Скажите а как в PreferenceActivity сделать свой стиль например задний фон и цвет текста?

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

Добавлено: 07 фев 2013, 23:50
dens
Вот тут глянь, может, поможет: viewtopic.php?f=25&t=912

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

Добавлено: 08 фев 2013, 00:29
rezak90
xottabut писал(а):Скажите а как в PreferenceActivity сделать свой стиль например задний фон и цвет текста?
смотрите нативную тему андроида, там есть атрибуты preferenceScreenStyle, preferenceFragmentStyle, preferenceCategoryStyle и т.д., в зависимости от того что вам нужно такой стиль и переопределяете

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

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

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

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

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

Добавлено: 14 фев 2013, 23:45
dens
Я, когда с таким сталкивался, менял состояние вьюшек странице в onPreferenceChange.
Или я не правильно понял вопрос?

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

Добавлено: 20 мар 2013, 23:26
Digetix
Здравствуйте. Делал по вашему примеру с 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;
	            }

				
	        });	       
	    }

	}

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

Добавлено: 14 апр 2013, 22:03
xr0m
Ребят, андроид генерирует сам окно настроек(Добавить 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.
Из описания ясно, что метод более для системы. А зачем же тогда он его генерирует? Как-то не понятно.

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

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

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

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

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

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

Добавлено: 19 дек 2013, 14:19
-Alex-
Добрый день!

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

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

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

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


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();
	}

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

Добавлено: 19 дек 2013, 16:49
Mikhail_dev
Дайте лог с ошибкой.

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

Добавлено: 19 дек 2013, 16:58
-Alex-
no-- писал(а):Дайте с ошибкой.
Что именно дать с ошибкой?

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

Добавлено: 19 дек 2013, 16:59
Mikhail_dev
блин, лог проглотил. Лог дайте с ошибкой =)