PreferenceActivity içinde 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 'u simgelerle doldurmak için, her Activity ActionBarActivity sınıfını genişletmelidir. Sorun şu ki Activity zaten PreferenceActivity 'i genişletiyor ve Java sınıflarında birden fazla sınıfa uzanamıyor.

ActionBar 'u bir PreferenceScreen ile birlikte almanın bir yolu olmalıdır. Bu genel sorun için herhangi bir çözüm sunabilseydim memnun olurum.

Not: PreferenceScreen'e nasıl düğme eklenir gibi bir çözüm ActionBar aslında başlık çubuğu olduğu için uygun değildir ve bu yüzden bir düzen öğesinden daha fazla bir Java'dır.

12
İsterseniz, yaptığım bir kütüphaneyi deneyebilirsiniz: github.com/AndroidDeveloperLB/MaterialStuffLibrary
katma yazar android developer, kaynak
Çok fazla korsanlık ve yansıma ile yetenekli bir programcı bunu yapabilirdi. Denedim - başarısız oldum.
katma yazar user1974640, kaynak
Resmi PreferenceFragment çalışmam var!
katma yazar user1974640, kaynak
Bu konuya bakın, size yardımcı olacağını düşünüyorum: stackoverflow.com/questions/2697233/… [1]: katma yazar thalsharif, kaynak

8 cevap

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


Çalışmayı başardım - bunun en güzel/en temiz çözüm olup olmadığından emin değil, ama işe yarıyor.

Aşağıdaki değişiklikleri yapmak zorunda kaldı:

  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
    }
    

Anlayabildiğim kadarıyla PreferenceActivity için 2 ve 3 numaralı değişiklikler gerekiyor:

"super.onCreate() işlevini çağırdığınız anda, ViewGroup ayarlanacak ve böylece Window parametrelerini değiştiremezsiniz." ( Oliver'ın cevaba yaptığı yorumu )

PreferenceActivity etkinliklerinin bileşenlerinin nasıl oluşturulduğunun sırasının, düz Activity etkinliklerinden farklı olduğu sanırım.

15
katma
PreferenceFragment içinde yüklenen normal bir actionbaractivity ayarlamak bunu gerçekleştirir. Başka birinin buraya gelmesi ancak bu basit çözümü dikkate almadığı durumlarda.
katma yazar CQM, kaynak
"ActionBarActivity'in bir kopyasını yapın" derken, kaynak kodu alıp kendi projeme kopyalamak mı istiyorsunuz? Mesela buradan mı? android. ; googlesource.com/platform/frameworks/support/+/&hellip
katma yazar Someone Somewhere, kaynak
Belki bu bir zamanlar çalıştı, ancak appcompat-v7_19.1.0 ActionBarActivity # onCreate çağrıları ActionBarActivityDelegate.createDelegate ((ActionBarActivity) bu) ile. Bu, PreferenceActivity alt sınıfını geçemediğiniz anlamına gelir.
katma yazar William, kaynak
Bunun için teşekkürler. Bunun için temiz bir çözüm yok gibi görünüyor. Artık Android uyumluluk eylem çubuğundan çok daha fazla işlevsellik sağlayan Action bar uygulamaları için ActionBarSherlock 'ı kullanıyorum.
katma yazar Matthias Robbers, kaynak
Bu çalışmayı elde etmek için android api versiyonunun 3.0'ın altında olup olmadığını kontrol etmem gerekiyordu (= 11), aksi halde bu işe yaramadı. Yani tercih sınıfında bunu super.onCreate (...) 'den önce yapmalıyım: if (ContextUtils.getAndroidApiVersion()
katma yazar dirkvranckaert, kaynak

Support-v4 Fragmentine dayalı bir PreferenceFragment uygulamasını denemek isterseniz:

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

Bunu kendi başıma kullanıyorum ve PreferenceActivity'i PreferenceFragment'e dönüştürmek pek işe yaramıyor.

5
katma
VAY!! Bu adam bir Google epik hatası 'yı düzeltti! Teşekkür ederim, +1
katma yazar Kling Klang, kaynak

ActionBarActivity kodunu klonlayabilir ve "PreferenceActivity'i genişletir" için "Activity'ı genişletir" ifadesini değiştirebilir misiniz? Ardından, ActionBarActivity yerine yeni sınıfınızı genişletin.

Gördüğüm tüm Google uygulamalarından, bir PreferenceActivity eylem çubuğuna düğmeler koymak sıra dışı görünüyor. Düğmeleri üzerine koymuyorsanız, holo temasını göstermek için bir değer-v11 alternatif stil kaynağı kullanabilir ve bu stili PreferenceActivity bildiriminiz için ayarlayabilirsiniz.

1
katma
ActionBarActivityDelegate nedeniyle yok
katma yazar user1974640, kaynak

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
katma
Teşekkürler. Şimdi çok güzel olan ActionBarSherlock kullanın. Bu kütüphanenin ilk versiyonları, johannilsson'un Actionbar'ını temel olarak kullanmıştır.
katma yazar Matthias Robbers, kaynak

Harika bir cevap veren @pyko'ya teşekkür etmek isterim, ancak HoneyComb ve yukarısında işe yaramadı problemi var. İyi bir şekilde, etrafta dolaşmak için bir hack yoluna sahip olabilirsiniz @AndroidDev;  Ama @pyko ActionBarHelperBase sınıfını kirletecek ve @AndroidDev çok saydam değil. En iyi yol, PreferenceActivity'den uzayan ActionBarActivityPreferences oluşturmak; ve onCreate yönteminde, arama üst yönteminin sırasını değiştirin:

@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);
}

neden 'mActionBarHelper.onCreate (savedInstanceState);' 'super.onCreate (savedInstanceState)' önce; çünkü super (yani PreferenceActivity) aslında içerik görünümünü onCreate yönteminde ayarlıyor, bu da çökmeye neden oluyor ("içerik eklemeden önce" requestFeature() 'ın çağrılması gerekiyor "). SO ihtiyacınız olan şey siparişi değiştirmektir. emin 'mActionBarHelper.onCreate (savedInstanceState);' süper önce denir.  Bu şekilde, 'ActionBarHelperBase''i kirletmemize gerek yok, ancak Ayarlama'yı çok temiz tutuyoruz çünkü zorlu detayı' ActionBarActivityPreferences 'ile kaplıyoruz ve patlama!

1
katma

Tercih etkinliğinde, aşağıdaki değişikliklere göre kolayca hareket çubuğu ekleyebilirsiniz:

AndroidManifest.xml 'de:


In v21/styles.xml


Back API desteği için v14/styles.xml 'de:


1
katma

Teşekkürler, sadece bir güncelleme, HoneyComb ve yukarısını desteklemek için Özel Başlık satırından önce bir if ifadesi eklemeniz gerekir.

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB)
   requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); 
0
katma

Bir ActionBarSherlock lib dosyası alabilir ve kodun SherlockPreference'ı genişletmesini sağlayabilirsiniz;

0
katma