Урок 73. Preferences. Управляем активностью настроек (setEnabled)

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

Урок 73. Preferences. Управляем активностью настроек (setEnabled)

Сообщение damager82 » 25 апр 2012, 23:00

В этом уроке:
- управляем активностью настроек (setEnabled)


Click here to read this article!
Последний раз редактировалось damager82 19 май 2017, 10:16, всего редактировалось 4 раза.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

brucemax
Сообщения: 117
Зарегистрирован: 01 апр 2012, 16:09
Откуда: Минск
Контактная информация:

Re: Урок 73. Preferences. Управляем активностью настроек (se

Сообщение brucemax » 20 ноя 2012, 16:16

А как сделать так чтобы например в 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. Вот понаписал-то.. но мало ли кому понадобиться.

Аватара пользователя
Isaev
Сообщения: 145
Зарегистрирован: 03 сен 2013, 09:39
Откуда: Германия
Контактная информация:

Re: Урок 73. Preferences. Управляем активностью настроек (se

Сообщение Isaev » 25 окт 2013, 12:01

Очень удобно это у них реализовано... и сохраняется всё само и загружается)
Не понял только пару моментов
1. просто android:dependency для категории нельзя указать?
2. и как сделать, чтобы приложение "забыло" настройки? (не программно)
3. Как реализуется пункт меню "Настройки по умолчанию"? Их же по идее можно очистить как-то, наверняка 1 командой и они тогда возьмуться из xml оригинального?
Или они в него же и перезаписываются при изменении? и надо тогда просто вписать программно все пункты по умолчанию

ps: и предоставленный выше пример что-то у меня не работает... Как всё таки корректно сделать, чтобы в Description of List выводился так же текущий выбранный пункт?

EvilAngel
Сообщения: 28
Зарегистрирован: 16 апр 2013, 23:55

Re: Урок 73. Preferences. Управляем активностью настроек (se

Сообщение EvilAngel » 25 окт 2013, 15:00

Интересный момент у меня прослеживался, когда хотел инвертировать поведение.

Т.е., чтобы воссоздать ситуацию "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.

Аватара пользователя
Isaev
Сообщения: 145
Зарегистрирован: 03 сен 2013, 09:39
Откуда: Германия
Контактная информация:

Re: Урок 73. Preferences. Управляем активностью настроек (se

Сообщение Isaev » 06 ноя 2013, 15:04

И всё же, где сохраняются все те настройки, которые мы в меню выбираем?
какой-то специальный внешний файл?

И как реализовать, чтобы в Description of List выводился так же текущий выбранный пункт?
Это удобно и чаще всего так и реализуется(на сколько встречал в приложениях), странно, что этому моменту не уделено внимание в уроке!

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

Re: Урок 73. Preferences. Управляем активностью настроек (se

Сообщение Mikhail_dev » 06 ноя 2013, 17:46

Вот код настроек.
[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

Аватара пользователя
Isaev
Сообщения: 145
Зарегистрирован: 03 сен 2013, 09:39
Откуда: Германия
Контактная информация:

Re: Урок 73. Preferences. Управляем активностью настроек (se

Сообщение Isaev » 25 ноя 2013, 11:52

Если мы переназначаем обработчик следующим образом:

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

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

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 73. Preferences. Управляем активностью настроек (se

Сообщение Foenix » 25 ноя 2013, 12:06

Что значит "программно вызвать"? создавайте метод свой и вызывайте где хотите.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Isaev
Сообщения: 145
Зарегистрирован: 03 сен 2013, 09:39
Откуда: Германия
Контактная информация:

Re: Урок 73. Preferences. Управляем активностью настроек (se

Сообщение Isaev » 25 ноя 2013, 13:58

Foenix писал(а):Что значит "программно вызвать"? создавайте метод свой и вызывайте где хотите.
значит после этого кода треуется автопозиционирование в значение по-умолчанию
какой метод то? вот он и создан обработчик события)
как это событие программно имитировать?

MiG_Kharkov
Сообщения: 4
Зарегистрирован: 28 сен 2015, 11:53

Re: Урок 73. Preferences. Управляем активностью настроек (se

Сообщение MiG_Kharkov » 30 сен 2015, 15:39

В 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){ }

AABL
Сообщения: 5
Зарегистрирован: 10 мар 2016, 15:20

Re: Урок 73. Preferences. Управляем активностью настроек (se

Сообщение AABL » 22 мар 2016, 11:27

Не работают последние два урока, android studio, android 6.0, api 23 :/ никаких ошибок, просто не запускается prefactivity. После нажатия меню-preferences ничего не происходит

Ответить