PreferenceActivity бағдарламасындағы ActionBar

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
Егер қаласаңыз, мен жасаған кітапхананы көре аласыз: 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 әрекеттерінің компоненттерінің қалай жасалатынын қарапайым Activity әрекеттерінен ерекшеленеді.

15
қосылды
PreferenceFragment бағдарламасында жай жүктелетін кәдімгі әрекеттер тақтасын орнату бұл әрекетті орындайды. Егер басқа біреу осында келсе, бірақ бұл қарапайым шешімді қарастырмаған болса.
қосылды автор CQM, көзі
Сіз «ActionBarActivity көшірмесін жасаңыз» деп айтқан кезде бастапқы кодты алып, оны өзімнің жобаға көшіргіңіз келе ме? Мысалы, мұнда? android. googlesource.com/platform/frameworks/support/+/…
қосылды автор Someone Somewhere, көзі
Мүмкін, бұл бір уақытта бір рет жұмыс істеген, бірақ appcompat-v7_19.1.0 ActionBarActivity # onCreate қоңырау шалуымен ActionBarActivityDelegate.createDelegate ((ActionBarActivity) бұл) . Бұл PreferenceActivity қосалқы сыныбында өту мүмкін емес дегенді білдіреді.
қосылды автор William, көзі
Бұл жұмыс үшін рахмет. Бұл үшін таза шешім жоқ сияқты. Енді Android үйлесімділік әрекеттер жолына қарағанда әлдеқайда көп функционалдылықты қамтамасыз ететін ActionBarSherlock қолданысқа арналған жолақты іске қосу үшін қолданылады.
қосылды автор Matthias Robbers, көзі
Бұл жұмысты алу үшін Android 3.0 нұсқасының (= 11) төмен екенін тексеру керек болдым, әйтпесе бұл жұмыс істемеді. Мәселен, артықшылықты сыныпта мен super.onCreate (...) алдында мұны істеуім керек: if (ContextUtils.getAndroidApiVersion()
қосылды автор dirkvranckaert, көзі

Егер сіз қолдау-v4 Фрагменті негізінде PreferenceFragment бағдарламасын іске қосқыңыз келсе:

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

Мен оны өзім пайдаланамын және PreferenceActivity параметрін PreferenceFragment ішіне айналдырасыз.

5
қосылды
МӘССАҒАН!! Бұл адам Google эпикалық сәтсіздікке ұшырады . Рахмет, +1
қосылды автор Kling Klang, көзі

ActionBarActivity кодын ғана клонирлей аласыз ба? «Предусилительность» белсенділігін кеңейтеді? Содан кейін 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 пайдаланамын, ол өте жақсы. Осы кітапхананың алғашқы нұсқалары johannilsson's Actionbar-ды негіз ретінде пайдаланған.
қосылды автор Matthias Robbers, көзі

Мен @pyko-ға үлкен жауап бергені үшін алғыс айтқым келеді, бірақ ол HoneyComb-да және одан жоғарыда жұмыс істемейтін проблема бар. жақсы @AndroidDev айтқан сияқты оны алу үшін хак жолы болуы мүмкін;  Бірақ @pyko ActionBarHelperBase сыныбын ластауға мәжбүр болады және @AndroidDev өте мөлдір емес. Ең жақсы жолы - PreferenceActivity қызметінен тұратын ActionBarActivityPreferences жасау; және on Crere әдісінде ата-ана әдісін шақыру тәртібін өзгертіңіз:

@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) контекстік көріністі шын мәнінде онКреат әдісінде орнатып, апатқа әкелуі мүмкін («requestFeature() мазмұнды қоспас бұрын» шақырылуы керек). mActionBarHelper.onCreate (сақталғанInstanceState); ' супер алдында шақырылады.  Осылайша, ActionBarHelperBase-ді ластауға тура келмейді, бірақ SettingActivity-ді өте таза ұстап тұрамыз, өйткені біз «ActionBarActivityPreferences» -ге және қатерге толы мәліметтерді инкапсуляциялаймыз!

1
қосылды

Сіз төмендегі өзгерістер арқылы артықшылық әрекетінде оңай әрекеттер тақтасын қосасыз:

AndroidManifest.xml ішінде:


In v21/styles.xml


Back API қолдауы үшін v14/styles.xml ішінде:



1
қосылды

Рахмет, жай ғана жаңару, HoneyComb және одан жоғары қолдау үшін Custom Headline жолына дейін if операторын қосу керек.

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB)
   requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); 
0
қосылды

ActionBarSherlock lib-ні алуға және кодты Шерлок Приверенцияны ұзартуға рұқсат ете аласыз;

0
қосылды