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 з абразкамі, кожны актыўнасць павінен падоўжыць ActionBarActivity класа. Праблема заключаецца ў тым, што мой актыўнасць ўжо пашырае PreferenceActivity і ў класах Java не можа распасцірацца больш аднаго класа.

Там павінен быць спосаб, каб атрымаць ActionBar разам з PreferenceScreen . Я быў бы рады, калі б хто-небудзь мог бы забяспечыць вырашэнне гэтай агульнай праблемы.

PS: Рашэнне, як у Як дадаць кнопку PreferenceScreen робіць не падыходзіць, таму што ActionBar на самой справе радок загалоўка і так гэта больш, чым Java раскладкай рэчы.

12
Калі вы хочаце, вы можаце паспрабаваць бібліятэку я зрабіў: github.com/AndroidDeveloperLB/MaterialStuffLibrary
дададзена аўтар android developer, крыніца
З вялікай колькасцю хакерства і рэфлексіі, дасведчаны праграміст можа зрабіць гэта. Я паспрабаваў - мне не ўдалося.
дададзена аўтар user1974640, крыніца
Я атрымаў афіцыйны PreferenceFragment працуе!
дададзена аўтар 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 (), то ViewGroup будзе створаны і такім чынам, вы не можаце змяніць параметры акна.» ( бачыць каментар Олівера ў адказ )

Я мяркую, што парадак таго, як кампаненты ў ствараюцца PreferenceActivity дзейнасць адрозніваецца ад раўнінных Актыўнасць <код /> дзейнасці.

15
дададзена
Настройка нармальнага actionbaractivity, які проста загружае ў PreferenceFragment вырашае гэтую задачу. У выпадку, калі хтосьці атрымлівае тут, але не лічыць гэта простае рашэнне.
дададзена аўтар CQM, крыніца
Калі вы кажаце «Зрабіце копію ActionBarActivity» вы маеце на ўвазе, каб узяць зыходны код і скапіяваць яго ў свой уласны праект? Напрыклад, тут? андроіда. googlesource.com/platform/frameworks/support/+/…
дададзена аўтар Someone Somewhere, крыніца
Можа быць, гэта працавала калісьці час, але з AppCompat-v7_19.1.0 ActionBarActivity # OnCreate выклікі ActionBarActivityDelegate.createDelegate ((ActionBarActivity) гэта) . Гэта азначае, што вы не можаце перадаць у PreferenceActivity падкласа.
дададзена аўтар William, крыніца
Дзякуем Вам за працу гэта. Падобна на тое, што няма чыстага рашэнні для гэтага. Я цяпер выкарыстоўваю ActionBarSherlock для штрыхавых рэалізацыі дзеянняў, якая забяспечвае значна больш функцыянальных магчымасцяў, чым у бары Android дзеянні сумяшчальнасці.
дададзена аўтар Matthias Robbers, крыніца
Для таго, каб атрымаць гэтую працу, я павінен быў праверыць, калі АНДРОІД версія АПА была ніжэй 3.0 (= 11), інакш гэта не спрацавала. Такім чынам, у класе перавагу я павінен зрабіць гэта да super.onCreate (...): калі (ContextUtils.getAndroidApiVersion()
дададзена аўтар dirkvranckaert, крыніца

Калі вы хочаце паспрабаваць рэалізацыю PreferenceFragment, заснаваную на апорна-v4 Фрагмент:

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

I'm, выкарыстоўваючы яго сам, і гэта будзе шмат працы павароту PreferenceActivity ў PreferenceFragment.

5
дададзена
WOW !! Гэты чалавек пафіксіўшы <б> эпапея Google не ў стане !! Дзякуй, +1
дададзена аўтар Kling Klang, крыніца

Вы можаце проста кланаваць код ActionBarActivity, і змяненне «пашырае актыўнасць» на «распаўсюджваецца PreferenceActivity»? Затым пашырыць свой новы клас замест ActionBarActivity.

З усіх прыкладанняў Google, якія я бачыў, хоць, здаецца, незвычайна паставіць кнопкі на панэлі дзеянні PreferenceActivity. Калі вы не прыкладваючы кнопкі на ім, вы маглі б проста выкарыстоўваць значэння-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 не вельмі transparent.The лепшы спосаб складаецца ў стварэнні 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 (savedInstanceState);' называе перад тым 'super.onCreate (savedInstanceState);' , Гэта таму, што супер (г.зн. PreferenceActivity) на самой справе налады выгляду кантэнту ў OnCreate метад, які можа выклікаць збой ( "requestFeature() павінна выклікацца перад даданнем кантэнту"). Так што вам трэба зрабіць, гэта памяняць парадак, зрабіць упэўнены, што 'mActionBarHelper.onCreate (savedInstanceState);' выклікаецца да супер.  Такім чынам, мы не павінны забруджваць «ActionBarHelperBase» пакуль мы трымаем SettingActivity вельмі чыстымі, таму што мы інкапсуляваць хітрую дэталь у «ActionBarActivityPreferences» і бац!

1
дададзена

Вы можаце лёгка дадаць панэль дзеянняў у прывілеяванай дзейнасці наступных змен:

У <моцны> AndroidManifest.xml :


In v21/styles.xml


У <моцны> v14/styles.xml для падтрымкі Назад API:


1
дададзена

Дзякуй, проста абнаўленне, вам трэба дадаць, калі заяву перад радком карыстацкага загалоўка для падтрымкі Honeycomb і вышэй.

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

Вы можаце атрымаць ActionBarSherlock LIB і хай вам код распаўсюджваецца SherlockPreference;

0
дададзена