Saya mengalami masalah saat menggunakan toolbar Desain Material baru di pustaka dukungan pada layar Preferensi.
Saya memiliki file settings.xml seperti di bawah ini:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:title="@string/AddingItems"
android:key="pref_key_storage_settings">
<ListPreference
android:key="pref_key_new_items"
android:title="@string/LocationOfNewItems"
android:summary="@string/LocationOfNewItemsSummary"
android:entries="@array/new_items_entry"
android:entryValues="@array/new_item_entry_value"
android:defaultValue="1"/>
</PreferenceCategory>
</PreferenceScreen>
String ditentukan di tempat lain.
android
android-actionbar
android-5.0-lollipop
android-actionbar-compat
android-toolbar
James Cross
sumber
sumber
Jawaban:
Silakan temukan Repo GitHub: Di Sini
Agak terlambat ke pesta, tapi ini solusi saya yang saya gunakan sebagai solusi untuk terus menggunakan
PreferenceActivity
:settings_toolbar.xml :
SettingsActivity.java :
Result :
UPDATE (Kompatibilitas Gingerbread):
Sesuai komentar, Perangkat Gingerbread mengembalikan NullPointerException di baris ini:
MEMPERBAIKI:
SettingsActivity.java :
Setiap masalah di atas beri tahu saya!
UPDATE 2: SOLUSI PENCETAKAN
Seperti yang ditunjukkan di banyak catatan pengembang
PreferenceActivity
tidak mendukung pewarnaan elemen, namun dengan memanfaatkan beberapa kelas internal Anda DAPAT mencapai ini. Itu sampai kelas-kelas ini dihapus. (Bekerja menggunakan appCompat support-v7 v21.0.3).Tambahkan impor berikut:
Kemudian ganti
onCreateView
metode:Result:
AppCompat 22.1
AppCompat 22.1 memperkenalkan elemen berwarna baru, yang berarti bahwa tidak perlu lagi menggunakan kelas internal untuk mencapai efek yang sama seperti pembaruan terakhir. Sebagai gantinya ikuti ini (masih menimpa
onCreateView
):LAYAR PREFERENSI NESTED
Banyak orang mengalami masalah dengan memasukkan Toolbar secara bersarang
<PreferenceScreen />
, tetapi saya telah menemukan solusinya !! - Setelah banyak trial and error!Tambahkan yang berikut ini ke Anda
SettingsActivity
:Alasan yang
PreferenceScreen
sangat merepotkan adalah karena mereka berbasis sebagai dialog pembungkus, jadi kita perlu menangkap tata letak dialog untuk menambahkan toolbar ke dalamnya.Bayangan Toolbar
Dengan desain mengimpor
Toolbar
tidak memungkinkan untuk elevasi dan shadowing di perangkat pra-v21, jadi jika Anda ingin memiliki elevasi pada Anda,Toolbar
Anda perlu membungkusnya dalamAppBarLayout
:settings_toolbar.xml
:Tidak lupa untuk menambahkan pustaka Dukungan Desain sebagai dependensi dalam
build.gradle
file:Android 6.0
Saya telah menyelidiki masalah tumpang tindih yang dilaporkan dan saya tidak dapat mereproduksi masalah tersebut.
Kode lengkap yang digunakan seperti di atas menghasilkan yang berikut ini:
Jika saya melewatkan sesuatu, beri tahu saya melalui repo ini dan saya akan menyelidikinya.
sumber
Anda dapat menggunakan
PreferenceFragment
, sebagai alternatifPreferenceActivity
. Jadi, inilahActivity
contoh pembungkusnya :Dan inilah file tata letaknya (pref_with_actionbar):
Dan akhirnya
PreferenceFragment
:Saya harap ini membantu seseorang.
sumber
ActionBarActivity
untuk mendapatkan toolbar dan fungsi terkait, tidak akan adaonBuildHeaders()
penggantian dan tidak ada dukungan preferensi aktual dalam aktivitas. Jika Anda menggunakan yang lamaPreferenceActivity
, Anda tidak memiliki bilah alat dan fungsi terkait (ya, Anda dapat memilikiToolbar
dan tata letak tetapi Anda tidak dapat memanggilsetSupportActionBar()
. Jadi, baik dengan header preferensi atau layar preferensi bersarang, kami tampaknya macet.Pembaruan yang benar-benar baru.
Dengan beberapa eksperimen, saya tampaknya telah menemukan solusi AppCompat 22.1+ yang berfungsi untuk layar preferensi bersarang.
Pertama, seperti yang disebutkan dalam banyak jawaban (termasuk satu di sini), Anda harus menggunakan yang baru
AppCompatDelegate
. GunakanAppCompatPreferenceActivity.java
file dari demo dukungan ( https://android.googlesource.com/platform/development/+/58bf5b99e6132332afb8b44b4c8cedf5756ad464/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatPreferenceActivity.java ) dan cukup expand darinya, atau salin fungsi yang relevan ke milik AndaPreferenceActivity
. Saya akan menunjukkan pendekatan pertama di sini:Tata letak yang menyertainya agak sederhana dan biasa (
layout/settings_page.xml
):Preferensi itu sendiri didefinisikan seperti biasa (
xml/settings.xml
):Tidak ada perbedaan nyata untuk solusi di internet sampai saat ini. Sebenarnya, Anda dapat menggunakan ini meskipun Anda tidak memiliki layar bersarang, tidak ada header, hanya satu layar.
Kami menggunakan kesamaan
PreferenceFragment
untuk semua halaman yang lebih dalam, dibedakan olehextra
parameter di header. Setiap halaman akan memiliki XML terpisah dengan bagianPreferenceScreen
dalamnya yang sama (xml/settings_page1.xml
et al.). Fragmen tersebut menggunakan tata letak yang sama dengan aktivitas, termasuk toolbar.Terakhir, ringkasan singkat tentang cara kerjanya. Yang baru
AppCompatDelegate
memungkinkan kita menggunakan aktivitas apa pun dengan fitur AppCompat, tidak hanya yang diperluas dari aktivitas yang sebenarnya di AppCompat. Ini berarti kita dapat mengubah yang lama yang bagusPreferenceActivity
menjadi yang baru dan menambahkan toolbar seperti biasa. Sejak saat itu, kami dapat tetap menggunakan solusi lama terkait layar dan header preferensi, tanpa penyimpangan dari dokumentasi yang ada. Hanya ada satu poin penting: jangan gunakanonCreate()
dalam aktivitas karena akan menyebabkan error. MenggunakanonBuildHeaders()
untuk semua operasi seperti menambahkan toolbar.Satu-satunya perbedaan nyata adalah, dan itulah yang membuatnya berfungsi dengan layar bersarang adalah Anda dapat menggunakan pendekatan yang sama dengan fragmen. Anda dapat menggunakan
onCreateView()
cara yang sama, memekarkan tata letak Anda sendiri daripada tata letak sistem, menambahkan bilah alat dengan cara yang sama seperti dalam aktivitas.sumber
R.drawable.abc_ic_ab_back_mtrl_am_alpha
PreferenceFragmentCompat
alih-alihPreferenceFragment
. Menyiapkanpreference-header
denganxmlns:app="http://schemas.android.com/apk/res-auto"
dan kemudianapp:fragment
bukannyaandroid:fragment
memuat layar prefs baru. Jadi mengalami masalah dengan kompatibilitas mundur ... saran?Jika Anda ingin menggunakan PreferenceHeaders, Anda dapat menggunakan pendekatan berikut:
layout / activity_settings.xml
Anda dapat menggunakan tata letak apa pun yang Anda inginkan di sini, pastikan Anda menyesuaikannya dalam kode Java juga.
Dan terakhir, file Anda dengan header (xml / pref_headers.xml)
sumber
android.R.id.content
, mengingat kita biasa meneruskanListView
denganandroid.R.id.list
untuk daftar preferensi itu sendiri (dan masih melakukannya jika menggunakan cara tanpa fragmen, tanpa header,).Dengan rilis Android Support Library 22.1.0 dan AppCompatDelegate yang baru, di sini Anda dapat menemukan contoh yang bagus dari implementasi PreferenceActivity dengan dukungan material dengan kompatibilitas mundur.
Perbarui Ini berfungsi pada layar bersarang juga.
https://android.googlesource.com/platform/development/+/marshmallow-mr3-release/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatPreferenceActivity.java
sumber
Meskipun jawaban di atas tampak rumit, jika Anda menginginkan solusi perbaikan cepat untuk menggunakan Toolbar dengan dukungan API 7 dan lebih tinggi sambil terus mengembangkan
PreferenceActivity
, saya mendapat bantuan dari proyek di bawah ini.https://github.com/AndroidDeveloperLB/ActionBarPreferenceActivity
activity_settings.xml
SettingsActivity.java
sumber
Saya juga telah mencari solusi untuk menambahkan toolbar dukungan v7 ( API 25 ) ke AppCompatPreferenceActivity (yang secara otomatis dibuat oleh AndroidStudio saat menambahkan SettingsActivity). Setelah membaca beberapa solusi dan mencoba masing-masing, saya berjuang untuk mendapatkan contoh PreferenceFragment yang dihasilkan untuk ditampilkan dengan toolbar juga.
Solusi modifikasi yang berhasil dilakukan berasal dari " Gabor ".
Salah satu peringatan yang saya hadapi adalah 'onBuildHeaders' hanya aktif sekali. Jika Anda memutar perangkat (seperti ponsel) ke samping, tampilan dibuat ulang dan PreferenceActivity dibiarkan tanpa toolbar lagi, namun PreferenceFragments akan mempertahankannya.
Saya mencoba menggunakan 'onPostCreate' untuk memanggil 'setContentView', sementara ini berfungsi untuk membuat ulang toolbar saat orientasi berubah, PreferenceFragments kemudian akan ditampilkan kosong.
Apa yang saya dapatkan dengan memanfaatkan hampir setiap tip dan jawaban yang dapat saya baca tentang subjek ini. Saya berharap orang lain juga merasakan manfaatnya.
Kami akan mulai dengan Java
Pertama di AppCompatPreferenceActivity.java (yang dihasilkan), saya memodifikasi 'setSupportActionBar' seperti ini:
Kedua , saya membuat kelas baru bernama AppCompatPreferenceFragment.java (saat ini nama yang tidak digunakan, meskipun mungkin tidak tetap seperti itu!):
Ini adalah bagian dari jawaban Gabor yang berhasil.
Terakhir , Untuk mendapatkan konsistensi kita perlu melakukan beberapa perubahan pada SettingsActivity.java :
Beberapa kode telah ditinggalkan dari aktivitas agar singkatnya. Komponen utama di sini adalah ' onAttachedFragment ', ' onPostCreate ', dan 'GeneralPreferenceFragment' sekarang memperluas ' AppCompatPreferenceFragment ' kustom alih-alih PreferenceFragment.
Ringkasan Kode : Jika ada fragmen, fragmen akan memasukkan tata letak baru dan memanggil fungsi 'setSupportActionBar' yang dimodifikasi. Jika fragmen tidak ada, SettingsActivity memasukkan tata letak baru ke 'onPostCreate'
Sekarang ke XML (sangat sederhana):
activity_settings.xml :
app_bar_settings.xml :
content_settings.xml :
Hasil Akhir :
sumber
Saya memiliki solusi baru (mungkin lebih rapi), yang menggunakan
AppCompatPreferenceActivity
sampel dari Dukungan v7. Dengan kode ini di tangan saya membuat tata letak saya sendiri yang menyertakan toolbar:Kemudian, di my
AppCompatPreferenceActivity
, saya mengubahsetContentView
untuk membuat tata letak baru saya, dan menempatkan tata letak yang disediakan di dalam myFrameLayout
:Lalu saya hanya memperpanjang
AppCompatPreferenceActivity
, mengizinkan saya untuk memanggilsetSupportActionBar((Toolbar) findViewById(R.id.toolbar))
, dan memekarkan item menu di toolbar juga. Semua sambil menjaga manfaat aPreferenceActivity
.sumber
Mari tetap sederhana & bersihkan di sini, tanpa merusak tata letak bawaan apa pun
sumber
root.getChildAt(0);
kembalinull
.Saya menemukan solusi sederhana ini saat mengerjakan ini. Pertama kita perlu membuat layout untuk aktivitas pengaturan.
activity_settings.xml
Pastikan Anda menambahkan tampilan daftar dengan
android:id="@android:id/list"
, jika tidak maka akan terlemparNullPointerException
Langkah selanjutnya adalah menambahkan
onCreate
metode (Ganti) di aktivitas pengaturan AndaSettings.java
Pastikan Anda mengimpor
android.suppoer.v7.widget.Toolbar
. Ini harus bekerja cukup banyak pada semua API di atas 16 (Jelly Bean dan lebih tinggi)sumber
Saya ingin melanjutkan solusi James Cross yang ditandai, karena setelah itu ada masalah menutup hanya layar bersarang yang aktif (PreferenceFragment) dengan cara tidak menutup SettingsActivity juga.
Sebenarnya itu berfungsi pada semua layar bersarang (jadi saya tidak mengerti solusi dari Gábor yang saya coba tanpa hasil, baik itu bekerja sampai titik tertentu tetapi itu berantakan dari beberapa bilah alat), karena ketika pengguna mengklik layar sub preferensi , hanya fragmen yang diubah (lihat
<FrameLayout android:id="@+id/content_frame" .../>
) bukan Toolbar yang selalu aktif dan terlihat, tetapi perilaku khusus harus diterapkan untuk menutup setiap fragmen sebagaimana mestinya.Di kelas utama
SettingsActivity
yang memperluasActionBarActivity
metode berikut harus dilaksanakan. Perhatikan bahwa pribadisetupActionBar()
dipanggil darionCreate()
Untuk judul layar bersarang yang dipilih, Anda harus mendapatkan referensi dari Toolbar Anda dan menyetel judul yang sesuai dengan
toolbar.setTitle(R.string.pref_title_general);
(misalnya).Tidak perlu mengimplementasikan
getSupportActionBar()
di semua PreferenceFragment karena hanya tampilan fragmen yang diubah di setiap commit, bukan Toolbar;Tidak perlu membuat kelas ToolbarPreference palsu untuk ditambahkan di setiap preferensi.xml (lihat jawaban Gábor).
sumber
Berikut adalah pustaka yang saya buat berdasarkan kode AOSP, yang menambahkan pewarnaan ke preferensi dan dialog, menambahkan bilah tindakan, dan mendukung semua versi dari API 7:
https://github.com/AndroidDeveloperLB/MaterialPreferenceLibrary
sumber
PreferenceScreen
dalamPreferenceScreen
seperti iniNah, ini masih menjadi masalah bagi saya hingga hari ini (18 Nov 2015). Saya telah mencoba semua solusi dari utas ini tetapi ada dua hal utama yang tidak dapat saya selesaikan:
Jadi saya akhirnya membuat perpustakaan dengan solusi yang lebih rumit. Pada dasarnya, saya harus menerapkan gaya secara internal ke preferensi jika kami menggunakan perangkat pra-Lollipop dan saya juga menangani layar bersarang menggunakan fragmen khusus (memulihkan semua hierarki bersarang dengan memanfaatkan kunci PreferenceScreen ).
Perpustakaannya adalah yang ini: https://github.com/ferrannp/material-preferences
Dan jika Anda tertarik dengan kode sumber (terlalu panjang untuk mempostingnya di sini), ini pada dasarnya adalah intinya: https://github.com/ferrannp/material-preferences/blob/master/library/src/main/ java / com / fnp / materialpreferences / PreferenceFragment.java
sumber