Урок 73. Preferences. Управляем активностью настроек (setEnabled)
Урок 73. Preferences. Управляем активностью настроек (setEnabled)
В этом уроке:
- управляем активностью настроек (setEnabled)
Click here to read this article!
- управляем активностью настроек (setEnabled)
Click here to read this article!
Последний раз редактировалось damager82 19 май 2017, 10:16, всего редактировалось 4 раза.
Re: Урок 73. Preferences. Управляем активностью настроек (se
А как сделать так чтобы например в ListPreference текст описания настройки( то есть текст под title) соответсвовал выбранной настройке?
Вопрос снимается, реализовал вот так:
Только проблема теперь, при повторном возврате на экран текст описания настройки другой и в MainActivity уже настроки не доходят , делаю так
Ключ "title"совпадает. Наверно не так объект настроек получаю. Так как же решить эту проблему?
[добавлено] Решил =)
Вот.. с этим кодом всё работает summary обновляется и корректно отображается при повторном вызове экрана настроек. На офиц. сайте советуют для этих целей встроить интерфейс OnSharedPreferenceChangeListener и реализовать метод onSharedPreferenceChanged(..), но у меня почему-то при изменении настроек этот метод не вызывается.
P.S. Вот понаписал-то.. но мало ли кому понадобиться.
Вопрос снимается, реализовал вот так:
Код: Выделить всё
etpTitleProfile = (EditTextPreference) findPreference("TitleProfile");
etpTitleProfile.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
etpTitleProfile.setSummary(newValue.toString());
return false;
}
});
Код: Выделить всё
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;
}
});
[добавлено] Решил =)
Код: Выделить всё
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 подтверждаем обновление настроек
}
});
}
P.S. Вот понаписал-то.. но мало ли кому понадобиться.
Re: Урок 73. Preferences. Управляем активностью настроек (se
Очень удобно это у них реализовано... и сохраняется всё само и загружается)
Не понял только пару моментов
1. просто android:dependency для категории нельзя указать?
2. и как сделать, чтобы приложение "забыло" настройки? (не программно)
3. Как реализуется пункт меню "Настройки по умолчанию"? Их же по идее можно очистить как-то, наверняка 1 командой и они тогда возьмуться из xml оригинального?
Или они в него же и перезаписываются при изменении? и надо тогда просто вписать программно все пункты по умолчанию
ps: и предоставленный выше пример что-то у меня не работает... Как всё таки корректно сделать, чтобы в Description of List выводился так же текущий выбранный пункт?
Не понял только пару моментов
1. просто android:dependency для категории нельзя указать?
2. и как сделать, чтобы приложение "забыло" настройки? (не программно)
3. Как реализуется пункт меню "Настройки по умолчанию"? Их же по идее можно очистить как-то, наверняка 1 командой и они тогда возьмуться из xml оригинального?
Или они в него же и перезаписываются при изменении? и надо тогда просто вписать программно все пункты по умолчанию
ps: и предоставленный выше пример что-то у меня не работает... Как всё таки корректно сделать, чтобы в Description of List выводился так же текущий выбранный пункт?
Re: Урок 73. Preferences. Управляем активностью настроек (se
Интересный момент у меня прослеживался, когда хотел инвертировать поведение.
Т.е., чтобы воссоздать ситуацию "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.
Т.е., чтобы воссоздать ситуацию "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
И всё же, где сохраняются все те настройки, которые мы в меню выбираем?
какой-то специальный внешний файл?
И как реализовать, чтобы в Description of List выводился так же текущий выбранный пункт?
Это удобно и чаще всего так и реализуется(на сколько встречал в приложениях), странно, что этому моменту не уделено внимание в уроке!
какой-то специальный внешний файл?
И как реализовать, чтобы в Description of List выводился так же текущий выбранный пункт?
Это удобно и чаще всего так и реализуется(на сколько встречал в приложениях), странно, что этому моменту не уделено внимание в уроке!
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Урок 73. Preferences. Управляем активностью настроек (se
Вот код настроек.
[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
[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
Если мы переназначаем обработчик следующим образом:
Как его принудительно программно вызвать?
типа onPreferenceChange(list,1);
Код: Выделить всё
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
Что значит "программно вызвать"? создавайте метод свой и вызывайте где хотите.
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
Re: Урок 73. Preferences. Управляем активностью настроек (se
значит после этого кода треуется автопозиционирование в значение по-умолчаниюFoenix писал(а):Что значит "программно вызвать"? создавайте метод свой и вызывайте где хотите.
какой метод то? вот он и создан обработчик события)
как это событие программно имитировать?
-
- Сообщения: 4
- Зарегистрирован: 28 сен 2015, 11:53
Re: Урок 73. Preferences. Управляем активностью настроек (se
В Android Studio все работает без добавления кода в класс PrefActivity, все записимости обрабатываются автоматически. В главной активности все просто прописывается чуть по другому, приводил код в прошлом уроке:
Если же надо обработать изменение настроек то для этого хорошо подойдет переопределение функции
@Override
public boolean onPreferenceChange(Preference preference, Object value){ }
Код: Выделить всё
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
Не работают последние два урока, android studio, android 6.0, api 23 :/ никаких ошибок, просто не запускается prefactivity. После нажатия меню-preferences ничего не происходит