Панель действий в PreferenceActivity - PullRequest
12 голосов
/ 28 октября 2011

Example: Android Market

В моем приложении я использую новый образец совместимости Action Bar от Google (расположен по адресу <sdk>/samples/android-<version>/ActionBarCompat), который отлично работает. Единственная проблема, которую я имею, - это применить это к моему PreferenceActivity, чтобы получить экран, подобный настройкам в Android Market (см. Рисунок).

Чтобы заполнить ActionBar значками, каждый Activity должен расширять класс ActionBarActivity. Проблема в том, что мой Activity уже расширяет PreferenceActivity и в классах Java не может расширять более одного класса.

Должен быть способ получить ActionBar вместе с PreferenceScreen. Я был бы рад, если бы кто-нибудь мог предоставить решение этой общей проблемы.

P.S .: Решение как в Как добавить кнопку в PreferenceScreen не подходит, потому что ActionBar на самом деле строка заголовка, и поэтому это больше Java, чем элемент макета.

Ответы [ 8 ]

15 голосов
/ 24 декабря 2011

Редактировать: Мой ответ ниже довольно хакерский, и кажется, что он уже устарел (для Android до версии 3.0) Посмотрите другие ответы для менее хакерских и более современных решений ~ pyko 2014-09-01


Мне удалось заставить его работать - не уверен, что это самое хорошее / чистое решение, но оно работает.

Пришлось внести следующие изменения:

  1. Сделайте копию ActionBarActivity и добавьте новый класс PreferenceActivity

    public abstract class ActionBarPreferenceActivity extends PreferenceActivity {
        // contents exactly the same as 'ActionBarActivity'
    }
    
  2. Измените onCreate() в ActionBarHelperBase.java немного - сделайте специальный случай для PreferenceActivity классов

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // If the activity is a PreferenceActivity, don't make the request
        if (!(mActivity instanceof PreferenceActivity)) {
            mActivity.requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
        }
    
  3. Сделайте так, чтобы ваша PreferenceActivity расширила этот класс и добавила запрос на FEATURE_CUSTOM_TITLE до , когда вы звоните super.onCreate()

    public class MyPreferenceActivity extends ActionBarPreferenceActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); // add this line
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.preferences);
            // etc etc
        }
    
        // etc etc
    }
    

Насколько я могу судить, изменения 2 и 3 необходимы, потому что для PreferenceActivity:

«Как только вы вызовете super.onCreate (), ViewGroup будет настроена, и вам не разрешено изменять параметры окна». ( см. Комментарий Оливера к ответу )

Я предполагаю, что порядок создания компонентов в PreferenceActivity действиях отличается от простых Activity действий.

5 голосов
/ 23 октября 2013

Если вы хотите попробовать реализацию PreferenceFragment, основанную на фрагменте support-v4:

https://github.com/kolavar/android-support-v4-preferencefragment

Я использую его самостоятельно, и это не большая работа, превращающая PreferenceActivity в PreferenceFragment.

1 голос
/ 16 декабря 2016

Вы можете легко добавить панель действий в действие предпочтений с помощью следующих изменений:

В AndroidManifest.xml :

<activity
        android:name=".activity.SettingsActivity"
        android:theme="@style/SettingsTheme"
        android:label="Settings"/>

В v21 / styles.xml

<style name="SettingsTheme" parent="@android:style/Theme.Material.Light.DarkActionBar">
    <item name="android:colorPrimary">@color/colorPrimary</item>
    <item name="android:colorPrimaryDark">@color/colorPrimaryDark</item>
</style>

In v14 / styles.xml для поддержки Back API:

<style name="SettingsTheme" parent="@android:style/Theme.Holo.Light.DarkActionBar">
    <item name="android:actionBarStyle">@style/ActionBar.V14.Movie.NoTitle</item>
</style>
1 голос
/ 19 июля 2012

Я хотел бы поблагодарить @pyko за отличный ответ, но у него есть проблема, что он не будет хорошо работать на HoneyComb и выше.хорошо, у вас может быть хакерский способ обойти это, как сказал @AndroidDev;Но @pyko будет загрязнять класс ActionBarHelperBase, а @AndroidDev не очень прозрачен. Лучший способ - создать ActionBarActivityPreferences, который расширяет PreferenceActivity;и в методе onCreate измените порядок вызова родительского метода:

@Override
protected void onCreate(Bundle savedInstanceState) {
    //IMPORTATNT: MAKE SURE actionBarHelper called before super;
    //as super oncreate of prefenceactivity is actuallying setting the content view
    mActionBarHelper.onCreate(savedInstanceState);
    super.onCreate(savedInstanceState);
}

почему вызывает 'mActionBarHelper.onCreate (saveInstanceState);'перед 'super.onCreate (saveInstanceState);'Это связано с тем, что super (то есть PreferenceActivity) фактически устанавливает представление контента в своем методе onCreate, что приведет к сбою («requestFeature () должен быть вызван перед добавлением контента»).уверен, что 'mActionBarHelper.onCreate (saveInstanceState);'перед супер

1 голос
/ 21 декабря 2011

Я использовал в своем приложении эту панель действий https://github.com/johannilsson/android-actionbar и эта тема отлично работает Как добавить кнопку в PreferenceScreen

1 голос
/ 06 ноября 2011

Можете ли вы просто клонировать код для ActionBarActivity и изменить «расширяет активность» на «расширяет PreferenceActivity»? Затем расширьте свой новый класс вместо ActionBarActivity.

Однако из всех приложений Google, которые я видел, довольно необычно размещать кнопки на панели действий PreferenceActivity. Если вы не надеваете на него кнопки, вы можете просто использовать ресурс альтернативного стиля values-v11, чтобы показать голографическую тему, и установить этот стиль в манифесте для вашей PreferenceActivity.

0 голосов
/ 24 апреля 2015

Вы можете получить библиотеку ActionBarSherlock и позволить вашему коду расширить SherlockPreference;

0 голосов
/ 09 апреля 2012

Спасибо, просто обновление, вам нужно добавить оператор if перед строкой Custom Title для поддержки HoneyComb и выше.

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB)
   requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...