Saya ingin menulis preferensi yang dapat diterapkan pada perangkat 3.0 dan pra-3.0. Menemukan yang PreferenceActivity
berisi metode yang sudah usang (meskipun ini digunakan dalam kode sampel yang menyertainya), saya melihat PreferenceFragement
dan paket kompatibilitas untuk menyelesaikan kesengsaraan saya.
Tampaknya, itu PreferenceFragment
tidak ada dalam paket kompatibilitas. Adakah yang bisa memberi tahu saya apakah ini disengaja? Jika demikian, dapatkah saya dengan mudah menargetkan berbagai perangkat (yaitu <3.0 dan> = 3.0) atau akankah saya harus melewati rintangan? Jika tidak sengaja dikecualikan, dapatkah kita mengharapkan rilis baru dari paket kompatibilitas? Atau adakah solusi lain yang aman untuk digunakan?
Bersulang
James
PreferenceFragment
yang akan Anda lupakan bahkan ada di sana. Lihat jawaban saya ."Because most of Preferences' implementation is hidden, therefore impossible to backport without lots of hackery."
PreferenceFragmentCompat
baru-baru ini ditambahkan ke perpustakaan dukungan.Jawaban:
Metode yang sudah usang tidak digunakan lagi di Android 3.0. Mereka baik-baik saja di semua versi Android, tetapi arahnya adalah untuk menggunakan
PreferenceFragment
Android 3.0 dan lebih tinggi.Dugaan saya adalah ini soal waktu rekayasa, tapi itu hanya dugaan.
Saya menganggap itu dilakukan "dengan mudah". Memiliki dua
PreferenceActivity
implementasi terpisah , satu menggunakan header preferensi danPreferenceFragments
yang lainnya menggunakan pendekatan asli. Pilih yang tepat di titik yang Anda butuhkan (misalnya, ketika pengguna mengklik item menu opsi). Berikut adalah contoh proyek yang menunjukkan ini. Atau, miliki satuPreferenceActivity
yang menangani kedua kasus, seperti dalam proyek sampel ini .Anda akan mengetahui kapan kita semua mencari tahu, yaitu, jika dan kapan kapal itu dikirim.
Lihat di atas.
sumber
<include>
bekerja dengan preferensi XML. BTW, jika Anda seorang pelanggan, pembaruan buku yang merujuk proyek ini diumumkan beberapa menit yang lalu.Implikasi halus dari jawaban dari @CommonsWare adalah bahwa - aplikasi Anda harus memilih antara API kompatibilitas atau API fragmen bawaan (sejak SDK 11 atau lebih). Sebenarnya itulah yang dilakukan oleh rekomendasi "mudah". Dengan kata lain, jika Anda ingin menggunakan PreferenceFragment, aplikasi Anda perlu menggunakan API fragmen bawaan dan menangani metode yang sudah tidak digunakan lagi di PreferenceActivity. Sebaliknya, jika penting bahwa aplikasi Anda menggunakan compat. API Anda akan dihadapkan dengan tidak memiliki kelas PreferenceFragment sama sekali. Dengan demikian, perangkat penargetan tidak menjadi masalah, tetapi kehebohan terjadi ketika Anda harus memilih salah satu atau API lainnya dan dengan demikian mengirimkan desain Anda ke solusi yang tidak terduga. Saya perlu compat. API jadi saya akan membuat kelas PreferenceFragment saya sendiri dan melihat cara kerjanya. Dalam skenario terburuk saya
EDIT: Setelah mencoba dan melihat kode di http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.1_r1/android/preference/PreferenceFragment.java? av = h - membuat PreferenceFragment saya sendiri tidak akan terjadi. Tampaknya penggunaan liberal paket-pribadi di PreferenceManager bukannya 'protected' adalah pemblokir utama. Sepertinya tidak ada keamanan atau motivasi yang sangat bagus untuk melakukan itu dan itu tidak bagus untuk pengujian unit tapi oh well ... kurang mengetik saya kira ...
EDIT v2: Sebenarnya itu terjadi dan berhasil. Jelas sakit kepala untuk membuat kode berfungsi dengan JAR API Kompatibilitas. Saya harus menyalin sekitar 70% paket com.android.preference dari SDK ke aplikasi saya dan kemudian bergulat dengan kode Java yang biasanya berkualitas biasa-biasa saja di Android. Saya menggunakan v14 dari SDK. Akan jauh lebih mudah bagi seorang insinyur Goog untuk melakukan apa yang saya lakukan, bertentangan dengan apa yang saya dengar beberapa insinyur Android katakan tentang topik ini.
BTW - apakah saya mengatakan "perangkat penargetan tidak menjadi masalah"? Benar-benar adalah ... jika Anda menggunakan com.android.preference Anda tidak akan dapat bertukar dengan API Kompatibilitas tanpa refactoring utama. Log yang menyenangkan!
sumber
Membangun berdasarkan jawaban CommonsWare serta pengamatan Tenacious, saya telah datang dengan solusi kelas turunan tunggal yang mampu menargetkan semua versi Android API saat ini dengan kerepotan minimal dan tanpa duplikasi kode atau sumber daya. Silakan lihat jawaban saya untuk pertanyaan terkait di sini: PreferenceActivity Android 4.0 dan sebelumnya
atau di blog saya: http://www.blackmoonit.com/2012/07/all_api_prefsactivity/
Diuji pada dua tablet yang menjalankan 4.0.3 dan 4.0.4 serta ponsel yang menjalankan 4.0.4 dan 2.3.3 dan juga sebuah emulator yang menjalankan 1.6.
sumber
Lihat PreferenceFragment-Compat dari Machinarius. Sangat mudah untuk turun dengan gradle dan saya lupa bahwa itu ada di sana.
compile 'com.github.machinarius:preferencefragment:0.1.1'
Perbarui penting: The Revisi terbaru dari
v7 support library
sekarang memiliki native PreferenceFragmentCompat .sumber
Pada Agustus 2015 Google merilis Perpustakaan Dukungan Preferensi v7 yang baru .
Sekarang Anda dapat menggunakan PreferenceFragmentCompat dengan
Activity
atauAppCompatActivity
Anda harus mengatur
preferenceTheme
tema Anda:Dengan cara ini Anda dapat mengubahsuaikan
preferenceTheme
ke gaya tata letak yang digunakan untuk setiap jenis preferensi tanpa memengaruhi bagian lain dari Aktivitas Anda.sumber
Jawaban Tenacious benar, tetapi di sini ada beberapa detail.
Alasan Anda tidak dapat "membuat tata letak normal dan mengikat komponen tampilan ke sharedprefs secara manual" adalah bahwa ada beberapa kelalaian mengejutkan di API android.preferences. PreferenceActivity dan PreferenceFragment keduanya memiliki akses ke metode PreferenceManager non-publik yang kritis, yang tanpanya Anda tidak dapat mengimplementasikan UI preferensi Anda sendiri.
Khususnya, untuk membuat hierarki Preferensi dari file XML, Anda harus menggunakan PreferenceManager, tetapi semua konstruktor PreferenceManager adalah paket-pribadi atau tersembunyi. Metode melampirkan Preferensi onClick pendengar ke aktivitas Anda juga paket-pribadi.
Dan Anda tidak dapat menyiasatinya dengan secara diam-diam meletakkan implementasi Anda dalam paket android.preferences, karena metode non-publik di API Android sebenarnya dihilangkan dari SDK. Dengan sedikit kreativitas yang melibatkan refleksi dan proksi dinamis, Anda masih bisa mendapatkannya. Satu-satunya alternatif, seperti yang dikatakan Tenacious, adalah memotong seluruh paket preferensi android.pre, termasuk setidaknya 15 kelas, 5 tata letak, dan sejumlah elemen style.xml dan attrs.xml yang serupa.
Jadi untuk menjawab pertanyaan awal, alasan Google tidak memasukkan PreferenceFragment dalam paket kompatibilitas adalah bahwa mereka akan mengalami kesulitan yang sama persis seperti Tenacious dan saya sendiri. Bahkan Google tidak dapat kembali ke masa lalu dan mempublikasikan metode-metode tersebut di platform lama (meskipun saya berharap mereka melakukannya di rilis mendatang).
sumber
Target aplikasi saya adalah API +14 tetapi karena menggunakan pustaka dukungan untuk beberapa navigasi mewah, saya tidak bisa menggunakan
android.app.Fragment
dan harus menggunakanandroid.support.v4.app.Fragment
, tetapi saya juga harus adaPreferenceFragment
di tempat tanpa perubahan besar pada kode di belakang.Jadi perbaikan mudah saya untuk memiliki kedua dunia perpustakaan dukungan dan
PreferenceFragment
:sumber
Saya perlu mengintegrasikan Preferensi ke dalam desain aplikasi dan tetap mendukung Android 2.3. Jadi saya masih membutuhkan PreferencesFragment.
Setelah beberapa pencarian saya menemukan lib android-support-v4-preferensifragment . Lib ini menghemat banyak waktu untuk menyalin dan refactoring PreferensiFragment asli seperti kata Tenacious. Bekerja dengan baik dan pengguna menikmati preferensi.
sumber