ActionBar в PreferenceActivity

Example: Android Market

In my application I am using the new Action Bar Compatibility sample from Google (located at /samples/android-/ActionBarCompat) which works great. The only problem I have is applying this to my PreferenceActivity in order to get a screen like the settings in the Android Market (see picture).

Щоб заповнити значки ActionBar , кожен Activity повинен розширити клас ActionBarActivity . Проблема полягає в тому, що мої Activity вже розширюють PreferenceActivity , а в класах Java не можна розширити більше одного класу.

Потрібно мати спосіб отримати ActionBar разом з PreferenceScreen . Я був би радий, якщо хтось міг би запропонувати рішення для цього спільного питання.

PS: Рішення, подібне до Як додати кнопку до екрана PreferenceScreen не відповідає тому, що ActionBar насправді є рядком заголовка, і тому це більше, ніж Java.

12
Якщо хочете, ви можете спробувати виконану бібліотеку:
додано Автор android developer, джерело
З великою кількістю злому і роздумів, кваліфікований програміст міг це зробити. Я пробував - я провалився.
додано Автор user1974640, джерело
Я отримав офіційний преференційний фрагмент!
додано Автор user1974640, джерело
Переглянути цю тему, я думаю, це допоможе вам: stackoverflow.com/questions/2697233/… [1]: stackoverflow.com/questions/2697233/…
додано Автор thalsharif, джерело

8 Відповіді

Edit: My answer below is rather hacky and it seems like it is now outdated (for pre Android 3.0) Have a look at the other answers for less hacky and more current solutions ~pyko 2014-09-01


Мені вдалося змусити його працювати - не впевнений, що це найкраще/найчистіше рішення, але він працює.

Потрібно було внести такі зміни:

  1. Make a copy of ActionBarActivity and have the new class extend PreferenceActivity

    public abstract class ActionBarPreferenceActivity extends PreferenceActivity {
       //contents exactly the same as 'ActionBarActivity'
    }
    
  2. Modify onCreate() in ActionBarHelperBase.java slightly - make a special case for PreferenceActivity classes

    @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. Have your PreferenceActivity extend this class and add request for FEATURE_CUSTOM_TITLE before you call 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 (), група налаштувань буде налаштована, і вам не буде дозволено змінювати параметри вікна." ( див. коментар Олівера до відповіді )

Думаю, порядок створення компонентів у PreferenceActivity відрізняється від звичайної діяльності Activity .

15
додано
Налаштування нормальної дії, яка просто завантажує в PreferenceFragment, виконує це. У випадку, якщо хтось потрапляє сюди, але не розглядає це просте рішення.
додано Автор CQM, джерело
Коли ви говорите "Зробити копію ActionBarActivity", ви маєте на увазі взяти вихідний код і скопіювати його в мій проект? Наприклад, звідси?
додано Автор Someone Somewhere, джерело
Можливо, це спрацювало один раз, але за допомогою appcompat-v7_19.1.0 ActionBarActivity # onCreate викликає ActionBarActivityDelegate.createDelegate ((ActionBarActivity)) . Це означає, що ви не можете передати підклас PreferenceActivity .
додано Автор William, джерело
Дякуємо за те, що ви працювали. Схоже, що для цього немає чистого рішення. Зараз я використовую ActionBarSherlock для реалізацій панелі дій, яка надає набагато більшу функціональність, ніж панель дій Android-сумісності.
додано Автор Matthias Robbers, джерело
Для того, щоб отримати цю роботу я повинен був перевірити, якщо андроїд API версія була нижче 3,0 (= 11) в іншому випадку це не працює. Таким чином, у класі переваг я повинен це зробити перед super.onCreate (...): if (ContextUtils.getAndroidApiVersion()
додано Автор dirkvranckaert, джерело

Якщо ви хочете спробувати реалізацію PreferenceFragment на основі фрагмента підтримки-v4:

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

Я використовую його сам, і це не багато роботи, перетворюючи PreferenceActivity в PreferenceFragment.

5
додано
ОГО!! Ця людина зафіксувала Google epic fail !! Дякуємо, +1
додано Автор Kling Klang, джерело

Чи можете ви просто клонувати код для ActionBarActivity, а змінити "extends Activity" на "extends PreferenceActivity"? Потім розширте новий клас замість ActionBarActivity.

З усіх програм Google, які я бачив, хоча, здається, незвично ставити кнопки на панелі дій в PreferenceActivity. Якщо ви не кладете на неї кнопки, ви можете просто скористатися альтернативним ресурсом style-v11, щоб показати тему холо, і встановити цей стиль у маніфесті для PreferenceActivity.

1
додано
Ні через ActionBarActivityDelegate
додано Автор user1974640, джерело

I used in my application this actionbar https://github.com/johannilsson/android-actionbar and it's work great with this thread How to add a button to PreferenceScreen

1
додано
Дякую. Зараз я використовую ActionBarSherlock , що дуже приємно. Перші версії цієї бібліотеки використовували Actionbar johannilsson як основу.
додано Автор Matthias Robbers, джерело

Я хотів би подякувати @pyko надає відмінну відповідь, але це проблема, що вона не буде добре працювати на HoneyComb і вище. добре ви можете мати спосіб зламати, щоб отримати його навколо, як @AndroidDev сказав;  Але @pyko буде забруднювати клас ActionBarHelperBase, а @AndroidDev не дуже прозорий. і в методі 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 (savedInstanceState);' до 'super.onCreate (savedInstanceState);' це тому, що супер (тобто PreferenceActivity) фактично встановлює перегляд контенту в своєму методі onCreate, що призведе до збоїв ("requestFeature() має бути викликаний перед додаванням вмісту"). sure 'mActionBarHelper.onCreate (savedInstanceState);' називається перед супер.  Таким чином, нам не потрібно забруднювати 'ActionBarHelperBase', але ми залишаємо дуже чітким параметр SettingActivity, тому що ми інкапсулюємо складну деталь до 'ActionBarActivityPreferences' і bang!

1
додано

Можна легко додати панель дій у налаштуваннях налаштувань за допомогою таких змін:

У AndroidManifest.xml :


In v21/styles.xml


У службі v14/styles.xml для підтримки Back API:



1
додано

Дякуємо, просто оновлення, ви повинні додати оператор if перед рядком Custom Title, щоб підтримати HoneyComb і вище.

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB)
   requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); 
0
додано

Ви можете отримати бібліотеку ActionBarSherlock і дозволити вам розширити код SherlockPreference;

0
додано
ІТ КПІ - Java
ІТ КПІ - Java
436 учасників

android_jobs_ua
android_jobs_ua
120 учасників

Публикуем вакансии и запросы на поиск работы по направлению Android. Здесь всё: full-time, part-time, remote и разовые подработки.

Mobile Dev Jobs UA
Mobile Dev Jobs UA
20 учасників

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin, RN и т.д.