Страница 1 из 1
Урок 73. Preferences. Управляем активностью настроек (setEnabled)
Добавлено: 25 апр 2012, 23:00
damager82
В этом уроке:
- управляем активностью настроек (setEnabled)
Click here to read this article!
Re: Урок 73. Preferences. Управляем активностью настроек (se
Добавлено: 20 ноя 2012, 16:16
brucemax
А как сделать так чтобы например в ListPreference текст описания настройки( то есть текст под title) соответсвовал выбранной настройке?
Вопрос снимается, реализовал вот так:
Код: Выделить всё
etpTitleProfile = (EditTextPreference) findPreference("TitleProfile");
etpTitleProfile.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
etpTitleProfile.setSummary(newValue.toString());
return false;
}
});
Только проблема теперь, при повторном возврате на экран текст описания настройки другой и в MainActivity уже настроки не доходят , делаю так
Код: Выделить всё
shPref = PreferenceManager.getDefaultSharedPreferences(this);
etpTitleProfile = (EditTextPreference) findPreference("title");
etpTitleProfile.setSummary(shPref.getString("title", "Session name"));
etpTitleProfile.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
etpTitleProfile.setSummary(newValue.toString());
return false;
}
});
Ключ "title"совпадает. Наверно не так объект настроек получаю. Так как же решить эту проблему?
[добавлено] Решил =)
Код: Выделить всё
public class SettingsActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener {
EditTextPreference etpTitleProfile;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.pref);
etpTitleProfile = (EditTextPreference) findPreference("title");
// при новом создании экрана заполняем summary значением настройки
etpTitleProfile.setSummary(etpTitleProfile.getText());
etpTitleProfile.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
etpTitleProfile.setSummary(newValue.toString()); // здесь можно было и аргументом метода воспользоваться
return true; // возвращая true подтверждаем обновление настроек
}
});
}
Вот.. с этим кодом всё работает summary обновляется и корректно отображается при повторном вызове экрана настроек. На офиц. сайте советуют для этих целей встроить интерфейс OnSharedPreferenceChangeListener и реализовать метод onSharedPreferenceChanged(..), но у меня почему-то при изменении настроек этот метод не вызывается.
P.S. Вот понаписал-то.. но мало ли кому понадобиться.
Re: Урок 73. Preferences. Управляем активностью настроек (se
Добавлено: 25 окт 2013, 12:01
Isaev
Очень удобно это у них реализовано... и сохраняется всё само и загружается)
Не понял только пару моментов
1. просто android:dependency для категории нельзя указать?
2. и как сделать, чтобы приложение "забыло" настройки? (не программно)
3. Как реализуется пункт меню "Настройки по умолчанию"? Их же по идее можно очистить как-то, наверняка 1 командой и они тогда возьмуться из xml оригинального?
Или они в него же и перезаписываются при изменении? и надо тогда просто вписать программно все пункты по умолчанию
ps: и предоставленный выше пример что-то у меня не работает... Как всё таки корректно сделать, чтобы в Description of List выводился так же текущий выбранный пункт?
Re: Урок 73. Preferences. Управляем активностью настроек (se
Добавлено: 25 окт 2013, 15:00
EvilAngel
Интересный момент у меня прослеживался, когда хотел инвертировать поведение.
Т.е., чтобы воссоздать ситуацию "checked-->disabled"(вместо описанного в уроке "checked-->enabled"):
[syntax=java5]mCheckBoxPref = (CheckBoxPreference)findPreference(getString(R.string.checkbox_pref_key));
mListPref= (ListPreference)findPreference(getString(R.string.list_pref_key));
mListPref.setEnabled(!mCheckBoxPref.isChecked());
mCheckBoxPref.setOnPreferenceClickListner(new OnPreferenceClickListner(){
@Override
public boolean onPreferenceClick(Preference preference){
mListPref.setEnabled(!mCheckBoxPref.isChecked());
}
});[/syntax]
пришлось отказаться от атрибута android:dependency, иначе получался скрытый конфликт "интересов".
Т.о. в ситуации, когда через dependency прописано правило прямой зависимости настроек, а в коде указывается обратная, приоритет отдаётся dependency.
Re: Урок 73. Preferences. Управляем активностью настроек (se
Добавлено: 06 ноя 2013, 15:04
Isaev
И всё же, где сохраняются все те настройки, которые мы в меню выбираем?
какой-то специальный внешний файл?
И как реализовать, чтобы в Description of List выводился так же текущий выбранный пункт?
Это удобно и чаще всего так и реализуется(на сколько встречал в приложениях), странно, что этому моменту не уделено внимание в уроке!
Re: Урок 73. Preferences. Управляем активностью настроек (se
Добавлено: 06 ноя 2013, 17:46
Mikhail_dev
Вот код настроек.
[syntax=java5]public static SharedPreferences More ...getDefaultSharedPreferences(Context context) {
return context.getSharedPreferences(getDefaultSharedPreferencesName(context),
getDefaultSharedPreferencesMode());
}
private static String More ...getDefaultSharedPreferencesName(Context context) {
return context.getPackageName() + "_preferences";
}
private static int More ...getDefaultSharedPreferencesMode() {
return Context.MODE_PRIVATE;
}[/syntax]
Чтобы получить доступ к настройкам, которые создаются по дефолту, надо выполнить следующий код
[syntax=java5]SharedPreferences mPreferences = c.getSharedPreferences(c.getPackageName() + "_preferences",Context.MODE_PRIVATE);[/syntax]
Другими словами, файл называется your.package.name_preferences
Re: Урок 73. Preferences. Управляем активностью настроек (se
Добавлено: 25 ноя 2013, 11:52
Isaev
Если мы переназначаем обработчик следующим образом:
Код: Выделить всё
ListPreference list = new ListPreference(this);
list.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
listPref=(ListPreference)preference;
String selStr=listPref.getEntries()[listPref.findIndexOfValue(newValue.toString())].toString();
listPref.setSummary("Select language ("+selStr+")");
return true;
}
});
Как его принудительно программно вызвать?
типа onPreferenceChange(list,1);
Re: Урок 73. Preferences. Управляем активностью настроек (se
Добавлено: 25 ноя 2013, 12:06
Foenix
Что значит "программно вызвать"? создавайте метод свой и вызывайте где хотите.
Re: Урок 73. Preferences. Управляем активностью настроек (se
Добавлено: 25 ноя 2013, 13:58
Isaev
Foenix писал(а):Что значит "программно вызвать"? создавайте метод свой и вызывайте где хотите.
значит после этого кода треуется автопозиционирование в значение по-умолчанию
какой метод то? вот он и создан обработчик события)
как это событие программно имитировать?
Re: Урок 73. Preferences. Управляем активностью настроек (se
Добавлено: 30 сен 2015, 15:39
MiG_Kharkov
В Android Studio все работает без добавления кода в класс PrefActivity, все записимости обрабатываются автоматически. В главной активности все просто прописывается чуть по другому, приводил код в прошлом уроке:
Код: Выделить всё
package ua.com.webtuning.startandroid;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
TextView tvInfo;
SharedPreferences sharedPreferences;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvInfo = (TextView) findViewById(R.id.tvInfo);
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
protected void onResume() {
String listValue = sharedPreferences.getString("list", "не выбрано");
tvInfo.setText("List value = " + listValue);
super.onResume();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
startActivity(new Intent(this, PrefActivity.class));
return true;
}
return super.onOptionsItemSelected(item);
}
}
Если же надо обработать изменение настроек то для этого хорошо подойдет переопределение функции
@Override
public boolean onPreferenceChange(Preference preference, Object value){ }
Re: Урок 73. Preferences. Управляем активностью настроек (se
Добавлено: 22 мар 2016, 11:27
AABL
Не работают последние два урока, android studio, android 6.0, api 23 :/ никаких ошибок, просто не запускается prefactivity. После нажатия меню-preferences ничего не происходит