Страница 1 из 1

SharedPreferences в Fragment

Добавлено: 10 дек 2014, 22:03
Sk_games
Всем доброго вечера.

Столкнулся с такой проблемой. Есть программа, между иконками на ActionBar, мы переключаемся в фрагментах, в одной из иконок есть фрагмент, и в уже в этом фрагменте картинка. При нажатии на картинку, мы переходим на другой фрагмент, который уже создали через Preferences. Там всего два ListPreference. И вот такие вопросы интересны, надеюсь кто поймет (т.к. сложно объяснить на словах :) Вопросы вроде не сложные, иногда даже хочется извинится, если они могут оказаться вовсе смешными)

1) Как, при выборе одного элемента из списка (ЛистПреференс) отловить его название и отобразить внизу.
Допустим выставив это значение в Summary Xml фрагмента. Можно ли так сделать, и как это реализовать?

2) Информацию о том. как отлавливать нажатия нашел через:
onSharedPreferenceChanged(SharedPreferences prefs,String key)
if(key.equals("наименование_параметра")) - вот так придется приравнивать каждый элемент?
Или может есть другие возможности отловить нажатия в этом списке Preference.

3) Сама функция сохранения параметров должна быть опубликована в главном активити?
А в фрагменте мы ее только вызываем, используя слушатель,?

Re: SharedPreferences в Fragment

Добавлено: 11 дек 2014, 01:53
doter.ua
1) В 73 уроке есть про OnPreferenceClickListener().
2)см. пункт 1. Можно сравнивать и так, но лучше не хардкодить текст напрямую, а использовать ресурс (который используется при создании настроек) чтобы при его изменении, не пришлось делать это много раз по всей программе.
3) Сохраняйте там, где у вас есть доступ к данным, которые, как ни странно, нужно сохранить. SharedPreferences можно получить во многих местах приложения через контекст (обычно this.блабла).

Re: SharedPreferences в Fragment

Добавлено: 11 дек 2014, 07:12
klblk

Re: SharedPreferences в Fragment

Добавлено: 11 дек 2014, 21:39
Sk_games
Спасибо на этом. А вот еще один вопрос. Я написал слушатель, для обновления данных, как в документации, Google посоветовал. Но не могу создать второй такой слушатель для другого списка Preference . Вот пример посмотрите.

MainActivity

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

public class MainActivity extends Activity implements OnPreferenceChangeListener {
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        /** Getting an instance of shared preferences, that is being used in this context */
        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
        
        /** Get the value stored in the share preferences corresponding to the key "lp_android_choice" */
        String android_choice = sp.getString("lp_android_choice", "None Selected");
        
        /** Getting an instance of the textview object corresponds to the layout in main.xml */
        TextView tv = (TextView) findViewById(R.id.android_version);
        
        /** Set the value to the textview object */
        tv.setText(android_choice);
        
    }
    
    /** This method is invoked by the ListPreference on changing its value */
    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {    	
    	TextView tv = (TextView) findViewById(R.id.android_version);
        tv.setText(newValue.toString());    	
    	return true;
    }    
    
}

И вот тут написал оброботчик в фрагменте, как создать еще один оброботчик, что бы, допустим, обновлял свои значения отдельно. Я пробовал создавать в самом фрагменте обработчик, но в таком случае выбираешь что то одно из двух списков - в мейне оба элемента применяют это значения. Т.к. я хочу сказать что реагируют они на один и тот же элемент.

FragmentSetting

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

public class MyPreferenceFragment extends PreferenceFragment{	
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		
		super.onCreate(savedInstanceState);
		addPreferencesFromResource(R.xml.preferences);
		
		/** Defining PreferenceChangeListener */
		OnPreferenceChangeListener onPreferenceChangeListener = new OnPreferenceChangeListener() {
			
			@Override
			public boolean onPreferenceChange(Preference preference, Object newValue) {				
				OnPreferenceChangeListener listener = ( OnPreferenceChangeListener) getActivity();
				listener.onPreferenceChange(preference, newValue);
				return true;
			}
		};	
		
		/** Getting the ListPreference from the Preference Resource */
		ListPreference p = (ListPreference ) getPreferenceManager().findPreference("lp_android_choice");
		
		/** Setting Preference change listener for the ListPreference */
		p.setOnPreferenceChangeListener(onPreferenceChangeListener);
		
		
		
	}

}
Получается надо что то изменить в мейне, но не могу догнать что именно. А документация гугл об этом не пишет.