Android вложенных PreferenceScreen с ActionBar

У меня в Android-приложении есть приложение SettingsActivity. Первоначально не было Actionbar, поэтому я воспользовался этим:

settings_toolbar.xml

<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/toolbar" app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="?attr/actionBarSize" app:navigationContentDescription="@string/abc_action_bar_up_description" android:background="?attr/colorPrimary" app:navigationIcon="?attr/homeAsUpIndicator" app:title="@string/action_settings" /> 

SettingsActivity.java

 public class SettingsActivity extends PreferenceActivity { @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); LinearLayout root = (LinearLayout)findViewById(android.R.id.list).getParent().getParent().getParent(); Toolbar bar = (Toolbar) LayoutInflater.from(this).inflate(R.layout.settings_toolbar, root, false); root.addView(bar, 0); // insert at top bar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); } } 

Он отлично работает, но только для первого PreferenceScreen. Если у меня есть вложенный PreferenceScreen, тогда нет ActionBar. Как я могу достичь этого, чтобы иметь на вложенном PreferenceScreen ActionBar с кнопкой возврата тоже?

Он должен быть совместим с API15 + и AppCombat

Оригинальное сообщение: Как добавить панель действий из библиотеки поддержки в PreferenceActivity?

Вместо использования вложенного PreferenceScreen мы можем использовать простое clickable Preference и заставить его работать так, как если бы он был «вложенным заголовком»; Это покажет обычный ActionBar, поскольку он запускает экземпляр PreferenceActivity и поэтому также будет поддерживать стиль навигации по одной панели / двойной панели. Вот несколько упрощенных примеров кода, который включает в себя настройку кнопки обратной навигации ActionBar:

main_preferences.xml

 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:orderingFromXml="true"> <Preference android:key="a_preference" /> <!-- this is our "nested header", a simple Preference --> <Preference android:key="subscreen_preference" /> <Preference android:key="another_ preference" /> </PreferenceSreen> 

subscreen_preference.xml

 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:orderingFromXml="true"> <Preference android:key="sub_preference" /> <!-- etc --> </PreferenceSreen> 

MyPreferenceActivity.class

 public class MyPreferenceActivity extends AppCompatPreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //display back button. Fragments will handle its behavior (see below) getSupportActionBar().setDisplayHomeAsUpEnabled(true); } @Override public void onBuildHeaders(List<Header> target) { loadHeadersFromResource(R.xml.pref_headers, target); } @Override protected boolean isValidFragment(String fragmentName) { return MainPreferenceFragment.class.getName().equals(fragmentName) || SubscreenFragment.class.getName().equals(fragmentName); } public static class MainPreferenceFragment extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { //let the fragment intercept the ActionBar buttons: setHasOptionsMenu(true); addPreferencesFromResource(R.xml.main_preferences); findPreference("subscreen_preference").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { //we create a Header manually: Header header = new Header(); //mandatory fragment name: header.fragment = "com.foo.MyPreferenceActivity$SubscreenFragment"; //subscreen title to be shown in the ActionBar header.titleRes = R.string.settings_fragment_title; //this will do the trick, no further action required: //we can ignore the second parameter ((MyPreferenceActivity)getActivity()).onHeaderClick(header, 0); return true; } }); } //this will make the ActionBar back navigation button // behave like the system back button @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == android.R.id.home) { if (!super.onOptionsItemSelected(item)) { getActivity().onBackPressed(); } return true; } return super.onOptionsItemSelected(item); } } public static class SubscreenFragment extends PreferenceFragment { //usual implementation } } 

Важно : если вы используете Proguard, не забудьте добавить следующее правило, иначе isInvalidFragment () вернет false:

 -keepnames class com.foo.MyPreferenceActivity$SubscreenFragment 
Intereting Posts
Аккаунт переноса приложения и ключевые вопросы api Как легко обфускать приложение для Android при использовании IntelliJ IDEA? Подача заявки в Кордове Возможно ли повторное использование макета в Kotlin Anko Android – словарь. Что быстрее, база данных или файл для чтения напрямую? Что происходит в главном потоке пользовательского интерфейса при открытии приложения для Android Получать изменения контакта (добавлено, удалено и изменено) Прочитать versionName из build.gradle в bash XMPP, WebSocket и другие вопросы «Обновление библиотеки Android» Задача eclipse случайно застряла в моем затмении Просмотр курсора базы данных Android Listview не обновляется в первый раз. Я вступил в Activity Sound Анимация затухания в градиенте формы формы Не удалось создать экземпляр приложения – ClassNotFoundException Ошибка. У указанного дочернего элемента уже есть родитель. Вы должны сначала вызвать removeView () родителя ребенка