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

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

Добавлено: 22 апр 2012, 23:00
damager82
В этом уроке:
- используем в настройках список
- группируем настройки по экранам и категориям


Click here to read this article!

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

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

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

Добавлено: 26 авг 2012, 17:54
xa4a4a
Ладно. Тогда может кто подскажет как обработать выбор в ListPreference и нажатие кнопки в EditPreference?

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

Добавлено: 07 окт 2012, 10:49
xa4a4a
нашел альтернативное решение. Использовал OnPreferenceChangeListener.

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

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

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

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

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

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

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

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

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

Добавлено: 11 янв 2013, 11:45
Vlady
а как показать не нижний уровень настроек, а конкретный PreferenceScreen?

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

Добавлено: 11 янв 2013, 13:55
elron
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.

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

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

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

Добавлено: 04 мар 2013, 20:24
djdance
решено

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

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

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

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

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

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

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

<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: Все, я разобрался, сам тупанул, накидал лишних тегов.

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

Добавлено: 06 мар 2014, 21:11
lana
Если кратко, то столкнулась с подобной проблемой, как у 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;
            }
        });
Не знаю, может ошибка в чём-то очень очевидном, но что-то серфинг по инету на этот раз не даёт ответа :? Подскажите пожалуйста в чём может причина такого поведения

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

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

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

Добавлено: 30 сен 2015, 15:20
MiG_Kharkov
Метод 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

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

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

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 (проверил лично) или подобную.
Может кому будет полезен мой опыт)

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

Добавлено: 04 ноя 2016, 12:24
pl--alex
Поясните, пожалуйста, почему такой код работает (сделал в одном проекте уроки 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 дважды, то по идее к обоим пунктам должен бы прицепиться интент, установленный в последней строчке.

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

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