У меня возникли проблемы с использованием новой панели инструментов Material Design в библиотеке поддержки на экране настроек.
У меня есть файл settings.xml, как показано ниже:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:title="@string/AddingItems"
android:key="pref_key_storage_settings">
<ListPreference
android:key="pref_key_new_items"
android:title="@string/LocationOfNewItems"
android:summary="@string/LocationOfNewItemsSummary"
android:entries="@array/new_items_entry"
android:entryValues="@array/new_item_entry_value"
android:defaultValue="1"/>
</PreferenceCategory>
</PreferenceScreen>
Строки определены в другом месте.
Ответы:
Пожалуйста, найдите репозиторий GitHub: здесь
Немного поздно для вечеринки, но это мое решение, которое я использую для продолжения использования
PreferenceActivity
:settings_toolbar.xml :
SettingsActivity.java :
Result :
ОБНОВЛЕНИЕ (Совместимость с пряниками):
Согласно комментариям, Gingerbread Devices возвращают исключение NullPointerException в этой строке:
FIX:
SettingsActivity.java :
Сообщите мне о любых проблемах с вышеуказанным!
ОБНОВЛЕНИЕ 2: ВОЗМОЖНОЕ РЕШЕНИЕ ПО ОКРАШИВАНИЮ
Как указано во многих заметках разработчика
PreferenceActivity
, не поддерживает тонирование элементов, однако, используя несколько внутренних классов, вы МОЖЕТЕ добиться этого. Пока эти классы не будут удалены. (Работает с использованием appCompat support-v7 v21.0.3).Добавьте следующий импорт:
Затем переопределите
onCreateView
метод:Result:
AppCompat 22.1
AppCompat 22.1 представил новые тонированные элементы, что означает, что больше нет необходимости использовать внутренние классы для достижения того же эффекта, что и при последнем обновлении. Вместо этого следуйте этому (все еще приоритетному
onCreateView
):Вложенные экраны предпочтений
Многие люди испытывают проблемы с включением Панели инструментов во вложенную,
<PreferenceScreen />
однако я нашел решение !! - После долгих проб и ошибок!Добавьте в свой
SettingsActivity
:Причина, по которой
PreferenceScreen
это такая неприятность, заключается в том, что они основаны на диалоге-оболочке, поэтому нам нужно зафиксировать макет диалога, чтобы добавить к нему панель инструментов.Тень панели инструментов
По дизайну, импорт
Toolbar
не допускает возвышения и затенения на устройствах до версии 21, поэтому, если вы хотите, чтобы у вас было повышение,Toolbar
вам нужно обернуть его вAppBarLayout
:settings_toolbar.xml
:Не забудьте добавить библиотеку поддержки дизайна в качестве зависимости в
build.gradle
файл:Android 6.0
Я исследовал проблему перекрытия, о которой сообщалось, и не могу воспроизвести ее.
Полный код, используемый, как указано выше, дает следующее:
Если мне что-то не хватает, дайте мне знать через это репо, и я займусь расследованием.
источник
Вы можете использовать
PreferenceFragment
в качестве альтернативыPreferenceActivity
. Итак, вотActivity
пример упаковки :А вот и файл макета (pref_with_actionbar):
И наконец
PreferenceFragment
:Я надеюсь, что это поможет кому-то.
источник
ActionBarActivity
для получения панели инструментов и связанных функций,onBuildHeaders()
переопределения и фактической поддержки предпочтений в действии не будет. Если вы используете старую версиюPreferenceActivity
, у вас нет панели инструментов и связанных функций (да, у вас может бытьToolbar
и макет, но вы не можете вызывать егоsetSupportActionBar()
. Итак, с заголовками предпочтений или вложенными экранами предпочтений мы, похоже, застряли.Совершенно новое обновление.
Поэкспериментировав, я, кажется, нашел рабочее решение AppCompat 22.1+ для вложенных экранов предпочтений.
Во-первых, как упоминается во многих ответах (включая один здесь), вам нужно будет использовать новый
AppCompatDelegate
. Либо использоватьAppCompatPreferenceActivity.java
файл поддержки демоса ( https://android.googlesource.com/platform/development/+/58bf5b99e6132332afb8b44b4c8cedf5756ad464/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatPreferenceActivity.java ) и просто продлить из него или скопируйте соответствующие функции в свои собственныеPreferenceActivity
. Я покажу здесь первый подход:Соответствующий макет довольно простой и привычный (
layout/settings_page.xml
):Сами предпочтения определяются как обычно (
xml/settings.xml
):До этого момента реальной разницы с решениями в сети нет. Фактически, вы можете использовать это, даже если у вас нет вложенных экранов, нет заголовков, только один экран.
Мы используем общий
PreferenceFragment
для всех более глубоких страниц, различающийсяextra
параметрами в заголовках. Каждая страница будет иметь отдельный XML с общимPreferenceScreen
внутренним (xml/settings_page1.xml
и др.). Фрагмент использует тот же макет, что и действие, включая панель инструментов.Наконец, краткое описание того, как это на самом деле работает. Новое
AppCompatDelegate
позволяет нам использовать любые действия с функциями AppCompat, а не только те, которые выходят из действий, которые фактически находятся в AppCompat. Это означает, что мы можем превратить старый добрыйPreferenceActivity
в новый и добавить панель инструментов как обычно. С этого момента мы можем придерживаться старых решений в отношении экранов предпочтений и заголовков без каких-либо отклонений от существующей документации. Есть только один важный момент: не используйтеonCreate()
в действии, потому что это приведет к ошибкам. использованиеonBuildHeaders()
для всех операций, таких как добавление панели инструментов.Единственная реальная разница в том, что заставляет его работать с вложенными экранами, это то, что вы можете использовать тот же подход с фрагментами. Вы можете использовать их так
onCreateView()
же, увеличивая свой собственный макет вместо системного, добавляя панель инструментов так же, как и в упражнении.источник
R.drawable.abc_ic_ab_back_mtrl_am_alpha
PreferenceFragmentCompat
вместоPreferenceFragment
. Настройкаpreference-header
with,xmlns:app="http://schemas.android.com/apk/res-auto"
а затемapp:fragment
вместоandroid:fragment
не загружает новый экран prefs. Итак, есть проблемы с обратной совместимостью ... предложения?Если вы хотите использовать PreferenceHeaders, вы можете использовать следующий подход:
макет / activity_settings.xml
Вы можете использовать здесь любой макет, который вам нравится, просто убедитесь, что вы также настроили его в коде Java.
И напоследок ваш файл с заголовками (xml / pref_headers.xml)
источник
android.R.id.content
, что мы раньше передавалиListView
withandroid.R.id.list
для самого списка предпочтений (и все еще делаем это, если вместо этого используем способ без фрагментов и заголовков).С выпуском библиотеки поддержки Android 22.1.0 и нового AppCompatDelegate здесь вы можете найти хороший образец реализации PreferenceActivity с материальной поддержкой и обратной совместимостью.
Обновить Он работает и на вложенных экранах.
https://android.googlesource.com/platform/development/+/marshmallow-mr3-release/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatPreferenceActivity.java
источник
Хотя приведенные выше ответы кажутся сложными, если вам нужно быстрое решение для использования панели инструментов с поддержкой API 7 и выше при расширении
PreferenceActivity
, я получил помощь от этого проекта ниже.https://github.com/AndroidDeveloperLB/ActionBarPreferenceActivity
activity_settings.xml
SettingsActivity.java
источник
Я тоже искал решение для добавления панели инструментов поддержки v7 ( API 25 ) в AppCompatPreferenceActivity (который автоматически создается AndroidStudio при добавлении SettingsActivity). Прочитав несколько решений и опробовав каждое из них, я изо всех сил пытался получить сгенерированные примеры PreferenceFragment для отображения на панели инструментов.
Модифицированное решение, которое вроде как сработало, было от " Gabor ".
Одно из предостережений, с которым я столкнулся, было то, что onBuildHeaders срабатывает только один раз. Если вы повернете устройство (например, телефон) на бок, представление воссоздается, и PreferenceActivity снова остается без панели инструментов, однако PreferenceFragments сохранит свою.
Я попытался использовать onPostCreate для вызова setContentView, хотя это работало для воссоздания панели инструментов при изменении ориентации, тогда PreferenceFragments были бы отображены пустыми.
То, что я придумал, использует практически все советы и ответы, которые я мог прочитать по этой теме. Я надеюсь, что и другие сочтут это полезным.
Начнем с Java
Сначала в (сгенерированном) AppCompatPreferenceActivity.java я изменил setSupportActionBar следующим образом:
Во-вторых , я создал новый класс с именем AppCompatPreferenceFragment.java (это текущее неиспользуемое имя, хотя оно может и не оставаться таким!):
Это сработала часть ответа Габора.
Наконец , для согласованности нам нужно внести некоторые изменения в SettingsActivity.java :
Некоторый код был исключен из упражнения для краткости. Ключевыми компонентами здесь являются « onAttachedFragment », « onPostCreate » и то, что «GeneralPreferenceFragment» теперь расширяет пользовательский « AppCompatPreferenceFragment » вместо PreferenceFragment.
Сводка кода : если фрагмент присутствует, фрагмент внедряет новый макет и вызывает измененную функцию setSupportActionBar. Если фрагмент отсутствует, SettingsActivity вставляет новый макет в onPostCreate
Теперь перейдем к XML (очень просто):
activity_settings.xml :
app_bar_settings.xml :
content_settings.xml :
Конечный результат :
источник
У меня есть новое (возможно, более аккуратное) решение, в котором используются
AppCompatPreferenceActivity
образцы из Support v7. С помощью этого кода я создал свой собственный макет с панелью инструментов:Затем в моем
AppCompatPreferenceActivity
я изменил,setContentView
чтобы создать свой новый макет, и поместил предоставленный макет в свойFrameLayout
:Затем я просто расширяю
AppCompatPreferenceActivity
, позволяя мне вызыватьsetSupportActionBar((Toolbar) findViewById(R.id.toolbar))
и расширять элементы меню на панели инструментов. И все это при сохранении преимуществPreferenceActivity
.источник
Давайте сохраним здесь простоту и чистоту, не нарушая встроенного макета.
источник
root.getChildAt(0);
возвращаетсяnull
.Я нашел это простое решение, работая над этим. Сначала нам нужно создать макет для настройки активности.
activity_settings.xml
Убедитесь, что вы добавили представление списка
android:id="@android:id/list"
, иначе оно выдастNullPointerException
Следующим шагом будет добавление
onCreate
метода (Override) в ваши настройки.Settings.java
Убедитесь, что вы импортируете
android.suppoer.v7.widget.Toolbar
. Это должно работать почти во всех API выше 16 (Jelly Bean и выше).источник
Я хотел бы продолжить отмеченное решение Джеймса Кросса, так как после этого возникает проблема закрытия только активного вложенного экрана (PreferenceFragment), чтобы не закрывать и SettingsActivity.
На самом деле он работает на всех вложенных экранах (поэтому я не понимаю решение Габора, которое я безуспешно пробовал, ну, оно работает до определенного момента, но это беспорядок из нескольких панелей инструментов), потому что, когда пользователь щелкает вспомогательный экран предпочтений , изменяется только фрагмент (см.
<FrameLayout android:id="@+id/content_frame" .../>
), а не панель инструментов, которая остается всегда активной и видимой, но необходимо реализовать настраиваемое поведение, чтобы соответственно закрыть каждый фрагмент.В
SettingsActivity
расширяющем основном классеActionBarActivity
должны быть реализованы следующие методы. Обратите внимание, что приватныйsetupActionBar()
вызывается изonCreate()
Для заголовка выбранного вложенного экрана вы должны получить ссылку на свою панель инструментов и установить соответствующий заголовок с помощью
toolbar.setTitle(R.string.pref_title_general);
(например).Нет необходимости реализовывать
getSupportActionBar()
во всем PreferenceFragment, так как при каждой фиксации изменяется только представление фрагмента, а не панель инструментов;Нет необходимости создавать поддельный класс ToolbarPreference для добавления в каждый файл preference.xml (см. Ответ Габора).
источник
Вот созданная мной библиотека, основанная на коде AOSP, который добавляет оттенки как в настройки, так и в диалоги, добавляет панель действий и поддерживает все версии из API 7:
https://github.com/AndroidDeveloperLB/MaterialPreferenceLibrary
источник
PreferenceScreen
внутри ,PreferenceScreen
как этогоЧто ж, это все еще проблема для меня сегодня (18 ноября 2015 г.). Я пробовал все решения из этой ветки, но я не смог решить две основные вещи:
В итоге я создал библиотеку с более сложным решением. По сути, мне пришлось внутренне применить стили к настройкам, если мы используем устройство до Lollipop, и я также обрабатывал вложенные экраны с помощью настраиваемого фрагмента (восстанавливая всю вложенную иерархию с помощью ключа PreferenceScreen ).
Вот эта библиотека: https://github.com/ferrannp/material-preferences
И если вас интересует исходный код (слишком длинный, чтобы размещать его здесь), это в основном его ядро: https://github.com/ferrannp/material-preferences/blob/master/library/src/main/ Java / COM / ФНП / materialpreferences / PreferenceFragment.java
источник