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?



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;

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


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'


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.


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

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.


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


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 .


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+

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.