Android-support-v4 ile PreferenceFragment'a Alternatifler


90

PreferenceFragments'ın bu kitaplıkta desteklenmediğini fark ettiğimde uygulamamın geliştirilmesinde ani bir durma noktasına geldim. Çaylak bir android geliştiricisinin bu engeli aşmak için kullanabileceği herhangi bir alternatif var mı?

Bu şu andan itibaren ana pencerem

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
<TabHost
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_weight="0"/>

        <FrameLayout
            android:id="@+android:id/realtabcontent"
            android:layout_width="fill_parent"
            android:layout_height="0dp"
            android:layout_weight="1"/>
    </LinearLayout>

                <TabWidget
            android:id="@android:id/tabs"
            android:orientation="horizontal"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0"
            />

</TabHost>
</LinearLayout>

TabActivity için çevrimiçi bulduğum bir şeyi kullanıyorum. İşte bir pasaj:

public class TabControlActivity extends FragmentActivity implements TabHost.OnTabChangeListener 
{
public static final int INSERT_ID = Menu.FIRST;
public static TabControlActivity thisCtx;
private TabHost mTabHost;
private HashMap mapTabInfo = new HashMap();
private TabInfo mLastTab = null;

private class TabInfo {
     private String tag;
     private Class clss;
     private Bundle args;
     private Fragment fragment;
     TabInfo(String tag, Class clazz, Bundle args) {
         this.tag = tag;
         this.clss = clazz;
         this.args = args;
     }

}

class TabFactory implements TabContentFactory 
{

    private final Context mContext;

    /**
     * @param context
     */
    public TabFactory(Context context) {
        mContext = context;
    }

    /** (non-Javadoc)
     * @see android.widget.TabHost.TabContentFactory#createTabContent(java.lang.String)
     */
    public View createTabContent(String tag) {
        View v = new View(mContext);
        v.setMinimumWidth(0);
        v.setMinimumHeight(0);
        return v;
    }

}

...*snip*...

Android-support-v4 uyumluluk kitaplığını kullanarak bir tercih parçasına (veya PreferenceActivity'ye) benzeyen bir şey uygulamak için herhangi bir şey var mı?



Bu tercihlerin bir tabhost içinde gösterilmesine "ihtiyaç duyduğum" bir durumda olduğum için gerçekten bir kopya değil. Düzenlememi gör
CodePrimate

Güncellenen cevabıma bakın . PreferenceFragmentCompatyakın zamanda destek kitaplığına eklendi.
theblang

Yanıtlar:


86

GÜNCELLEME - 6/11/2015

Support-v7 kitaplığı artık içerir PreferenceFragmentCompat. Bu yüzden onu kullanmak daha iyi bir fikir olacak.


Aşağıdaki projeyi uygulamanıza bir kitaplık projesi olarak ekleyin.

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

Parça işleminiz dahil her şeyi olduğu gibi saklayabilirsiniz. PreferenceFragmentSınıfı içe aktarırken doğru içe aktarma başlığının kullanıcı olduğundan emin olun.

import android.support.v4.preference.PreferenceFragment;

onun yerine

import android.preference.PreferenceFragment;

4
Bu github kodunun ciddi sorunları var gibi görünüyor ... Kullanamıyorum RingtonePreferenceve OnSharedPreferenceChangeListenerherhangi bir değişiklik almıyor gibi görünüyor!
madlymad

2
Bu kütüphaneyi kullanmanın iyi bir fikir olduğunu düşünüyordum. Ama düşündüğüm kadar iyi olmadığını anladım. onPrepareOptionMenuYöntemi geçersiz kılmaya çalışmak bana, voidhepimizin bildiği varsayılan olandan farklı (geri dönen ) garip bir imza (geri dönen boolean) gösteriyor !!! ciddi bir sorun.
S.Thiongane

9
oy verildi ve Madrid'e her gelişinizde bedava bir akşam yemeği hakkınız var ... bu konu beni deli ediyordu!
2014

7
@mansoulx onPrepareOptionsMenu, parçalar üzerinde her zaman bir void dönüş türüne sahiptir (boolean olan Aktivitelerin aksine), bu nedenle bu imza tamamen beklendiği gibidir.
Cumbayah

3
Kütüphaneyle ilgili sorunlar muhtemelen github projesinde rapor edilmelidir.
Mathijs Segers

128

Bunun eski bir soru olduğunu biliyorum, ancak artık PreferenceFragmentCompatşuradan kullanabilirsiniz :com.android.support:preference-v7:23.3.0


4
Harika bul, bu şimdi doğru cevaplardan biri.
Mythul

Benim için yalnızca com.android.support:preference-v7:23.0.1 ile çalışır.
Felipe Mosso

1
Bu, Android Studio'dan eklemeye çalışırken bağımlılık sunucularında görünmüyor. Bunun için bir depo eklemem gerekiyor mu?
Brill Pappin

Bu sınıfı içermiyor
JJ Ab

1
Yanlışlıkla bu cevaba oy verdim ve şimdi geri alamıyorum, bunun yerine bunun PreferenceFragmentCompatbazı önemli sorunları olduğunu not edeceğim : örneğin bunu ve bu hata raporunu ve burada daha fazlasını görün . Bunun PreferenceActivityyerine kullanımdan kaldırılanı kullandım. ah
Vicky Chijwani

16

Önemli Güncelleme: en son revizyon ait v7 support libraryartık bir yerli vardır PreferenceFragmentCompat .

Ben kullanıyorum Bu kütüphaneyi bir vardır, AARiçinde mavenCentralkullandığınız zaman kolayca dahil edebilirsiniz Gradle.

compile 'com.github.machinarius:preferencefragment:0.1.1'


Destek parçasını nasıl içe aktardığınızı ve genişlettiğinizi paylaşır mısınız? Teşekkürler
Steven

1
@Steve Tabii! Bir Özet yaptım .
theblang

@mattblang Çok teşekkürler!
Steven

@mattblang Çok teşekkürler ... Yardımın gerçekten benim zamanımı kurtarıyor
Esad Ullah Rafiq

İstisna java.lang.RuntimeException: İçerik, ListView sınıfı olmayan 'android.R.id.list' kimlik özniteliğine sahip bir görünüme sahip
Abdul Rahman

10

Benimkini kullanabilirsin PreferenceFragment.

Çok basit ve şimdiye kadar hiç sorun yaşamadım. Sanırım bunlardan yalnızca birini tek bir Aktivitede tek seferde görüntüleyebileceğinizi düşünüyorum, ki bu tamam olmalıdır.


9

Tercihler Destek Kitaplığı: Etkinlik ne olursa olsun API 7+ için Tercih Parçaları

Basit bir uygulama, aşağıdaki gibi bir PreferenceFragmentCompat içerir:

public class PreferencesFragment extends PreferenceFragmentCompat {
    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        addPreferencesFromResource(R.xml.preferences);
    }
}

Ayrıca temanızda PreferenceTheme öğesini ayarlamanız gerekir:

<style name="AppTheme" parent="@style/Theme.AppCompat.Light">
  <item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
</style>

Ve bunu bağımlılıklara ekleyin: http://developer.android.com/tools/support-library/features.html

com.android.support:preference-v14:23.1.0

7

Belki gerçek bir aktivite ve parça kullanabilirsin, ama bunun iyi bir seçim olduğunu düşünmüyorum. Basit PreferenceActivity kullanmalı ve retro uyumlu kitaplarda iyileştirmeler beklemelisiniz.


1
Uygulamamın geri kalanı bir tabwidget içerdiğinden PreferenceActivity kullanamıyorum. Tercih parçasının sekme hedefinin üzerinde gösterilmesi gerekir. Bunu bir aktivite yapmak yerine tüm ekranı kaplayacaktı.
CodePrimate

2
Öyleyse bazı özel liste parçalarını kullanın
zapl


0

Bunun yerine PreferenceActivity'den genişletebilirsiniz ve bir ActionBar'a sahip olmak isterseniz, bir Araç Çubuğu kullanarak ekleyebilirsiniz. , tercihler için kullanılan ListView'ün üzerinde .

Bu, Araç Çubuğunu tutan dikey bir LinearLayout ve android: id = "@ android: id / list" ile bir ListView kullanılarak yapılabilir .

Dilerseniz çözümümü burada görebilirsiniz .


0

Lucius'un söylediği gibi PreferenceFragmentCompat'ı kullanabilirsiniz :

public class MyPreferenceFragment extends PreferenceFragmentCompat {
        @Override
        public void onCreatePreferences(Bundle bundle, String s) {               
            PreferenceManager.setDefaultValues(getActivity(), R.xml.preferences, false);
            addPreferencesFromResource(R.xml.preferences);
       }
}

Bağımlılığını gradle'a eklemelisiniz:

dependencies {
...
    compile 'com.android.support:preference-v7:23.1.X' (wherX = 0,1,...)
...
}

Bu şekilde android.support.v4.app.FragmentTransaction ve PrefernceFragment'ın FragmentTransaction'ını da kullanabilirsiniz. Ancak temalarla ilgili sorunlarınız olabilir. Durum böyleyse, bu yazıyı dikkate alarak çözebilirsiniz:

Materyal temasını API 14+ üzerinde korurken kütüphanenin API 7+ üzerinde çalışmasını sağlayan çözüm

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.