Урок 72. Preferences. Список, экраны и категории

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

Урок 72. Preferences. Список, экраны и категории

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

В этом уроке:
- используем в настройках список
- группируем настройки по экранам и категориям


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

xa4a4a
Сообщения: 8
Зарегистрирован: 20 июл 2012, 12:39

Re: Урок 72. Preferences. Список, экраны и категории

Сообщение xa4a4a » 23 авг 2012, 12:27

Доброго времени суток.
Когда я нажимаю на ListPreference на экран выходит список. Какие методы при этом вызываются? Я так понимаю что Activity в onPause не уходит. Мне интересен метод вызываемый при выборе элемента из списка.

xa4a4a
Сообщения: 8
Зарегистрирован: 20 июл 2012, 12:39

Re: Урок 72. Preferences. Список, экраны и категории

Сообщение xa4a4a » 26 авг 2012, 17:54

Ладно. Тогда может кто подскажет как обработать выбор в ListPreference и нажатие кнопки в EditPreference?

xa4a4a
Сообщения: 8
Зарегистрирован: 20 июл 2012, 12:39

Re: Урок 72. Preferences. Список, экраны и категории

Сообщение xa4a4a » 07 окт 2012, 10:49

нашел альтернативное решение. Использовал OnPreferenceChangeListener.

gera
Сообщения: 9
Зарегистрирован: 11 окт 2012, 23:30

Re: Урок 72. Preferences. Список, экраны и категории

Сообщение gera » 22 ноя 2012, 21:07

Ребята, вы пробовали запускать это на андроид 2.2 ? Почему-то весь экран начинает толи путаться в теме оформления, толи еще в чем-то.. по умолчанию тема светлая android:Theme.Light, но в PrefActivity на странице Screen экран становится черным, а когда трогаешь экран пальцем, чекбоксы становятся светлыми.

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

Re: Урок 72. Preferences. Список, экраны и категории

Сообщение damager82 » 23 ноя 2012, 13:36

gera писал(а):Ребята, вы пробовали запускать это на андроид 2.2 ? Почему-то весь экран начинает толи путаться в теме оформления, толи еще в чем-то.. по умолчанию тема светлая android:Theme.Light, но в PrefActivity на странице Screen экран становится черным, а когда трогаешь экран пальцем, чекбоксы становятся светлыми.
Очень может быть. У меня на Galaxy Tab 10.1 с Android 3.2 похожие баги наблюдались при запуске PreferenceFragment c PreferenceScreen-ами.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
elron
Сообщения: 31
Зарегистрирован: 14 окт 2012, 13:29

Re: Урок 72. Preferences. Список, экраны и категории

Сообщение elron » 01 дек 2012, 20:41

Тут пример со статическим списком, а как отображать динамический список? Чтоб также мог добавлять значения в массив. Например отображать последние файлы, которые были открыты программой.

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

Re: Урок 72. Preferences. Список, экраны и категории

Сообщение damager82 » 06 дек 2012, 16:33

elron писал(а):Тут пример со статическим списком, а как отображать динамический список? Чтоб также мог добавлять значения в массив. Например отображать последние файлы, которые были открыты программой.
Посмотрите здесь viewtopic.php?f=3&t=123&p=6421#p6421
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
Vlady
Сообщения: 7
Зарегистрирован: 04 мар 2012, 07:41
Контактная информация:

Re: Урок 72. Preferences. Список, экраны и категории

Сообщение Vlady » 11 янв 2013, 11:45

а как показать не нижний уровень настроек, а конкретный PreferenceScreen?

Аватара пользователя
elron
Сообщения: 31
Зарегистрирован: 14 окт 2012, 13:29

Re: Урок 72. Preferences. Список, экраны и категории

Сообщение elron » 11 янв 2013, 13:55

Vlady писал(а):а как показать не нижний уровень настроек, а конкретный PreferenceScreen?
В xml-файле добавляете PreferenceScreen(по сути просто кнопка)

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

<PreferenceScreen 
android:key="key" 
android:title="title"
android:summary="summary" >
</PreferenceScreen>
Потом в коде добавляете метод:

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

public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
Log.d("myLog", "onPreferenceTreeClick " + preference.getKey());
if (preference.getKey().contains("key")){ } }
Создаёте новый Layout и указываете его в PreferenceScreen в поле Layout.

Аватара пользователя
dens
Сообщения: 47
Зарегистрирован: 03 фев 2013, 00:14

Re: Урок 72. Preferences. Список, экраны и категории

Сообщение dens » 03 фев 2013, 18:40

Интересную вещь заметил: если мы выбрали какую-то настройку через список, то при открытии списка (для обновления значения) выбранный ранее пункт будет выделен (я сначала полагал, что этот текущий установленный пункт определялся по соответствующему значению настройки в SharedPreferences). Но вот если удалить настройки (через edit().clear().commit()), то выделенный пункт не снимается, как ни крути, даже не помогает обновление списка значений через setEntries и setEntryValues (надеялся, что там есть какой-нибудь SelectedItem и его можно скинуть вручную).
То есть, чтобы скинуть этот пункт, остаётся только пересоздавать этот ListPreference?

djdance
Сообщения: 48
Зарегистрирован: 04 дек 2012, 15:33

Re: Урок 72. Preferences. Список, экраны и категории

Сообщение djdance » 04 мар 2013, 20:24

решено

Не могу понять, простой список не запоминает свое значение, точнее запоминает, но через раз.

(... - тут был код, но это неважно)

так вот, Log выводит пункты почти всегда не те что я отметил, а ранее отмеченные. Захожу в настройки вновь - там опять старое значение. На второй раз может и сработать. А может и не сработать. Последовательность не совпадает с тем, как я их выделяю. Что такое, в чем дело? :(

UPD чекбоксов это тоже касается.
UPD1 У меня параллельно в сервисе раз в секунду могут забираться настройки через
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
может быть, это мешает окну настроек брать и обновлять?
UPD final - да, сервису надо запрещать проверять настройки, пока открыто окно настроек. Кошмар. Пришлось запрещать ему бродкастом. Теперь все работает

miraemor
Сообщения: 1
Зарегистрирован: 16 мар 2013, 19:14

Re: Урок 72. Preferences. Список, экраны и категории

Сообщение miraemor » 16 мар 2013, 19:21

У меня есть вопрос, как сменить фон основного экрана настроек?
Я нашел вариант с созданием своей темы оформления вот так:

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

<style name="PrefsTheme" parent="@android:style/Theme.Black.NoTitleBar">
        <item name="android:windowBackground">@drawable/prefs_bg</item>
        <item name="android:textColor">@color/prefs_bg</item>
        <item name="android:listViewStyle">@style/listViewPrefs</item>
    </style>

    <style name="listViewPrefs" parent="@android:style/Widget.ListView">
        <item name="android:background">@drawable/prefs_bg</item>
        <item name="android:cacheColorHint">@color/prefs_bg</item>
        <item name="android:textColor">@color/text_color</item>
    </style>
Но в таком случае картинка устанавливается как для основного экрана настроек, так и для диалога с радиобатонами от ListPreference.


UPD: Все, я разобрался, сам тупанул, накидал лишних тегов.

lana
Сообщения: 2
Зарегистрирован: 06 мар 2014, 20:46

Re: Урок 72. Preferences. Список, экраны и категории

Сообщение lana » 06 мар 2014, 21:11

Если кратко, то столкнулась с подобной проблемой, как у djdance. Только нет у меня сервиса, который ежесекундно "просит" настройки.. а проявления те же - с первого раза "кликания" по пункту списка настроек (listPreference) лог сообщает что всё ещё выбран прошлый пункт списка, и только после второго клика приложение наконец-то "понимает", какой пункт действительно был выбран..

Если немного подробней, то суть приложение в том, чтобы запустить слушателя статуса телефонных звонков (PhoneStateListener), так что активити я запускаю только для того чтобы юзер мог кликнуть в пункте меню и выбрать включить или же выключить слушателя. Для этого у меня есть ещё одно активити - "контейнер" для PreferenceFragment, в котором я отслеживаю изменения в listreference

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

ListPreference listPreference = (ListPreference) findPreference("list");
        listPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {

            public boolean onPreferenceChange(Preference preference, Object newValue) {
                ListPreference listPref = (ListPreference) preference;
                String userC = listPref.getValue();
                Log.d(LOG, "Settingfragment, onCreate, userChoice = " + userC);

                SharedPreferences settings = getActivity().getSharedPreferences("preferences", Context.MODE_PRIVATE);
                SharedPreferences.Editor editor = settings.edit();
                editor.putString("list", userC);
                editor.commit();

                return true;
            }
        });
Не знаю, может ошибка в чём-то очень очевидном, но что-то серфинг по инету на этот раз не даёт ответа :? Подскажите пожалуйста в чём может причина такого поведения

lana
Сообщения: 2
Зарегистрирован: 06 мар 2014, 20:46

Re: Урок 72. Preferences. Список, экраны и категории

Сообщение lana » 07 мар 2014, 00:04

Я дочиталась в документации в чём была проблема - "Sets the callback to be invoked when this Preference is changed by the user (but before the internal state has been updated).", т.е. колбек "приходит" когда настройка изменяется НО ДО РЕАЛЬНОГО ИЗМЕНЕНИЯ В СИСТЕМЕ ;)

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

Re: Урок 72. Preferences. Список, экраны и категории

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

Метод addPreferencesFromResource усталел и с Android Studio код MainActivity можно переписать так:

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

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);
    }
}
Используем пунк меню, который создает IDE по умолчанию и загружаем найстройки опять таки уже созданной функцией запукая Intent

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

Re: Урок 72. Preferences. Список, экраны и категории

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

Сделал всё по уроку, при нажатии "Menu" - "Preferences" ничего не происходит, не появляется окно с настройками.
Пример с 71 урока выполнил, запустил, всё нормально работает. А этот почему-то не работает. Не перепечатывал, скопипастил.
Android Studio 1.5.1.
Может кто сталкивался?

Раздолбайт
Сообщения: 1
Зарегистрирован: 14 окт 2016, 10:54

Re: Урок 72. Preferences. Список, экраны и категории

Сообщение Раздолбайт » 27 окт 2016, 11:11

AABL писал(а):Сделал всё по уроку, при нажатии "Menu" - "Preferences" ничего не происходит, не появляется окно с настройками.
Пример с 71 урока выполнил, запустил, всё нормально работает. А этот почему-то не работает. Не перепечатывал, скопипастил.
Android Studio 1.5.1.
Может кто сталкивался?
Похожая ситуация. Что в этом, что в 71-м уроке. Сначала не было меню. Совсем. Белый экран с TextView. С помощью предыдущих уроков и гугла вроде получил что нужно. Но окно настроек тоже не вызывается. Android Studio 2.1.3. Api 24. Запускал на реальном устройстве с 6.0.1 на борту

up
Методом научного тыка удалось починить)
В манифесте строки android:theme="@style/AppTheme" и android:theme="@style/AppTheme.NoActionBar" удаляем. В xml устанавливаем тему DarkActionBar (проверил лично) или подобную.
Может кому будет полезен мой опыт)

pl--alex
Сообщения: 4
Зарегистрирован: 24 окт 2016, 17:19

Re: Урок 72. Preferences. Список, экраны и категории

Сообщение pl--alex » 04 ноя 2016, 12:24

Поясните, пожалуйста, почему такой код работает (сделал в одном проекте уроки 71 и 72).

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

@Override
     public boolean onCreateOptionsMenu(Menu menu) {
         MenuItem menuItem = menu.add(0,1,0,"Preferences");
         menuItem.setIntent(new Intent(this,PrefActivity.class));
         menuItem = menu.add(0,2,1,"Preferences2");
         menuItem.setIntent(new Intent(this, Pref2Activity.class));
         return super.onCreateOptionsMenu(menu);
     }
В данном случае создается меню с 2мя строчками и на каждую вешается свой интент.
И я не понимаю поему это работает.
Мне кажется, что раз метод setIntent применяется к одному объекту menuItem дважды, то по идее к обоим пунктам должен бы прицепиться интент, установленный в последней строчке.

UserOfPikabu
Сообщения: 2
Зарегистрирован: 08 авг 2018, 07:26

Re: Урок 72. Preferences. Список, экраны и категории

Сообщение UserOfPikabu » 21 сен 2018, 21:59

Здравствуйте.
Уже третий день бьюсь с уроком. Дошло уже до того, что просто скопировал весь код в нужные файлы, скомпилировал и установил на устройство.
Кликаю по меню, появляется вкладка Preference, кликаю на вкладку и все, больше ничего не происходит. В чем может быть проблема?

Ответить