Alternatif untuk PreferenceFragment dengan android-support-v4

90

Saya tiba-tiba berhenti dalam pengembangan aplikasi saya karena saya menyadari bahwa PreferenceFragments tidak didukung di perpustakaan ini. Adakah alternatif yang bisa digunakan oleh developer android pemula untuk mengatasi kendala ini?

Ini adalah jendela utama saya saat ini

<?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>

Untuk TabActivity saya, saya menggunakan sesuatu yang saya temukan online. Berikut cuplikannya:

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*...

Apakah ada yang akan mengimplementasikan sesuatu yang menyerupai preferencefragment (atau preferenceActivity) menggunakan pustaka kompatibilitas android-support-v4?

CodePrimate
sumber
Tidak benar-benar duplikat seperti saya dalam situasi di mana saya "membutuhkan" preferensi ini untuk ditampilkan dalam tabhost. Lihat suntingan saya
CodePrimate
Lihat jawaban terbaru saya . PreferenceFragmentCompatbaru-baru ini ditambahkan ke pustaka dukungan.
theblang

Jawaban:

86

UPDATE - 6/11/2015

Library support-v7 sekarang menyertakan PreferenceFragmentCompat. Jadi akan menjadi ide yang lebih baik untuk menggunakannya.


Tambahkan proyek berikut sebagai proyek perpustakaan ke aplikasi Anda.

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

Anda dapat menyimpan semuanya termasuk transaksi fragmen Anda apa adanya. Saat mengimpor PreferenceFragmentkelas, pastikan header impor yang benar adalah pengguna.

import android.support.v4.preference.PreferenceFragment;

dari pada

import android.preference.PreferenceFragment;
Subin Sebastian
sumber
4
Kode github tersebut sepertinya memiliki masalah serius ... Saya tidak dapat menggunakan RingtonePreferencedan juga OnSharedPreferenceChangeListenertidak mendapatkan perubahan apa pun!
Mando Stam
2
Saya pikir itu ide yang bagus untuk menggunakan perpustakaan ini. Tetapi saya menyadari bahwa itu tidak sebaik yang saya kira. Mencoba untuk mengganti onPrepareOptionMenumetode menunjukkan kepada saya tanda tangan aneh (kembali void) berbeda dengan yang default yang kita semua tahu (kembali boolean) !!! masalah serius.
S.Thiongane
9
mendapat suara positif, dan Anda berhak atas makan malam gratis setiap kali Anda datang ke Madrid ... masalah ini membuatku gila!
rupps
7
@mansoulx onPrepareOptionsMenu selalu memiliki tipe pengembalian void pada fragmen (tidak seperti untuk Aktivitas, yang berupa boolean), jadi tanda tangan ini sepenuhnya seperti yang diharapkan.
Cumbayah
3
Masalah dengan perpustakaan mungkin harus dilaporkan di proyek github.
Mathijs Segers
128

Saya tahu ini adalah pertanyaan lama, tetapi sekarang Anda dapat menggunakan PreferenceFragmentCompatdaricom.android.support:preference-v7:23.3.0

Lucius
sumber
4
Great ditemukan, ini adalah salah satu jawaban yang benar sekarang.
Mythul
Bagi saya ini hanya bekerja dengan com.android.support:preference-v7:23.0.1.
Felipe Mosso
1
Ini sepertinya tidak ada di server dependensi saat mencoba menambahkannya dari Android Studio. APAKAH saya perlu menambahkan repositori untuk itu?
Brill Pappin
Tidak berisi kelas itu
JJ Ab
1
Saya tidak sengaja memberi suara positif pada jawaban ini dan saya tidak dapat membatalkannya sekarang, jadi saya hanya akan mencatat bahwa PreferenceFragmentCompatada beberapa masalah utama: lihat ini dan laporan bug ini , misalnya, dan banyak lagi di sini . Saya akhirnya menggunakan yang sudah usang PreferenceActivitysebagai gantinya. menghela napas
Vicky Chijwani
16

Perbarui penting: The Revisi terbaru dari v7 support librarysekarang memiliki native PreferenceFragmentCompat .

Saya menggunakan perpustakaan ini , yang memiliki AARin mavenCentralsehingga Anda dapat dengan mudah memasukkannya jika Anda menggunakan Gradle.

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

theblang
sumber
Bisakah Anda berbagi cara mengimpor dan memperluas fragmen dukungan? Terima kasih
Steven
1
@ Steve Yakin! Saya membuat Gist a .
theblang
@mattblang Terima kasih banyak!
Steven
@mattblang Terima kasih banyak ... Bantuan Anda benar-benar menghemat banyak waktu saya
Asad Ullah Rafiq
Pengecualian java.lang.RuntimeException: Konten memiliki tampilan dengan atribut id 'android.R.id.list' yang bukan kelas ListView
Abdul Rahman
10

Anda bisa menggunakan saya sendiri PreferenceFragment.

Ini sederhana dan sejauh ini saya tidak memiliki masalah dengan itu. Saya pikir Anda hanya dapat menampilkan salah satu dari mereka pada satu waktu dalam satu Aktivitas, yang seharusnya OK.

BladeCoder
sumber
9

Preferences Support Library: Fragmen Preferensi untuk API 7+, apa pun Aktivitasnya

Implementasi sederhana akan menyertakan PreferenceFragmentCompat seperti:

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

Anda juga perlu mengatur Preferensi Tema di tema Anda:

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

Dan tambahkan ini dalam dependensi: http://developer.android.com/tools/support-library/features.html

com.android.support:preference-v14:23.1.0
li2
sumber
7

Anda mungkin bisa menggunakan aktivitas nyata dan menggunakan fragmen, tapi menurut saya itu bukan pilihan yang baik. Anda harus menggunakan PreferenceActivity sederhana dan menunggu peningkatan di perpustakaan compat retro.

Snicolas
sumber
1
Saya tidak dapat menggunakan PreferenceActivity karena aplikasi saya lainnya terdiri dari tabwidget. Preferensifragmen seharusnya ditampilkan di atas tabwidget. Saya akan menjadikannya sebagai aktivitas alih-alih akan memakan seluruh layar.
CodePrimate
2
Kemudian gunakan beberapa fragmen daftar kustom
zapl
2

Anda dapat menggunakan pustaka pihak ketiga seperti UnifiedPreferences untuk menggunakan API tunggal untuk semua versi Android.

MarcoDuff
sumber
0

Anda dapat memperluas dari PreferenceActivity , dan jika Anda ingin memiliki ActionBar, Anda dapat menambahkannya menggunakan Toolbar karena berada di atas ListView yang digunakan untuk preferensi.

Ini dapat dilakukan dengan menggunakan LinearLayout vertikal yang menampung Toolbar dan ListView dengan android: id = "@ android: id / list" .

Jika mau, Anda dapat melihat solusi saya di sini .

pengembang android
sumber
0

Seperti yang dikatakan Lucius, Anda dapat menggunakan PreferenceFragmentCompat :

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

Anda harus memasukkan ketergantungannya dalam gradle:

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

Dengan cara ini Anda juga bisa menggunakan FragmentTransaction dari android.support.v4.app.FragmentTransaction dan PrefernceFragment. Namun, Anda mungkin mengalami masalah dengan tema. Jika demikian, Anda dapat mengatasinya dengan mempertimbangkan posting ini:

Solusi untuk membuat lib berfungsi pada API 7+ sambil mempertahankan tema material pada API 14+

vicasdia.dll
sumber