Saya memiliki aktivitas yang memperluas PreferenceActivity. Saya memuat preferensi dari file xml. Tetapi dalam beberapa kasus saya perlu menyembunyikan sepenuhnya salah satu preferensi dari layar berdasarkan status aplikasi saya. Ada metode setEnabled, tetapi itu bukan yang saya inginkan. Saya ingin menghapus preferensi itu dari layar sepenuhnya. Apa itu mungkin ?
android
preferences
Alex Volovoy
sumber
sumber
setEnabled()
Jika Anda
Preference
berada dalam aPreferenceCategory
, Anda harus melakukan ini:XML:
<PreferenceCategory android:key="category_foo" android:title="foo"> <CheckBoxPreference android:key="checkPref" />
Jawa:
CheckBoxPreference mCheckBoxPref = (CheckBoxPreference) findPreference("checkPref"); PreferenceCategory mCategory = (PreferenceCategory) findPreference("category_foo"); mCategory.removePreference(mCheckBoxPref);
sumber
PreferenceCategory
.Jika Preferensi adalah turunan langsung dari layar preferensi, berikut beberapa kode yang berdiri sendiri:
PreferenceScreen screen = getPreferenceScreen(); Preference pref = getPreferenceManager().findPreference("mypreference"); screen.removePreference(pref);
sumber
findPreference
untuk kategori tersebut, dan menghapus preferensi dari kategoriJika Anda menggunakan PreferenceFragmentCompat, Anda dapat menyetel visiblity dalam xml.
Preferensi di xml Anda akan dikonversi ke versi AppCompat secara otomatis. Anda kemudian dapat menggunakan atribut ' app: isPreferenceVisible ' di xml Anda
preferensi.xml
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"> <CheckBoxPreference android:defaultValue="false" android:key="show.navigation" android:title="Show navigation" app:isPreferenceVisible="false" /> ...
Atribut tersebut didokumentasikan di https://developer.android.com/guide/topics/ui/settings/components-and-attributes
Penambahan
PreferenceFragmentCompat
didokumentasikan di https://developer.android.com/guide/topics/ui/settings/#inflate_the_hierarchyContoh:
public class MySettingsActivity extends AppCompatActivity { public static class MySettingsFragment extends PreferenceFragmentCompat { @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { setPreferencesFromResource(R.xml.preferences, rootKey); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getSupportFragmentManager() .beginTransaction() .replace(R.id.settings_container, new MySettingsFragment()) .commit(); } }
sumber
Jika Anda menginginkan sesuatu yang secara dinamis akan mengubah preferensi misalnya pada SwitchPreference, saya telah menemukan cara terbaik adalah dengan meletakkan semua sub opsi saya ke dalam dua wadah kategori. Awalnya Anda akan melihat semuanya, lalu Anda cukup menghapus bit yang tidak Anda inginkan. Bagian yang cerdas, adalah Anda hanya memicu pembuatan ulang ketika sesuatu berubah dan kemudian Anda tidak perlu membuat apa pun secara manual atau khawatir tentang meletakkan kembali semuanya dalam urutan yang benar.
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); PreferenceCategory prefCatOne= (PreferenceCategory)findPreference("prefCatOne"); PreferenceCategory prefCatTwo= (PreferenceCategory)findPreference("prefCatTwo"); SwitchPreference mySwitchPref= (SwitchPreference)findPreference("mySwitchPref"); PreferenceScreen screen = getPreferenceScreen(); if (mySwitchPref.isChecked()) { screen.removePreference(prefCatOne); } else { screen.removePreference(prefCatTwo); } } public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { if (key.equals("mySwitchPref")) { this.recreate(); } }
Satu-satunya downside yang dapat saya lihat dengan ini, adalah ada flash saat layar dibuat ulang dari awal.
sumber
Di file XML Anda:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:key="preferenceScreen"> <PreferenceCategory android:key="personalisation" android:title="your title here"> <ThemedPreference android:key="animation" /> </PreferenceScreen>
Dalam kode Anda:
PreferenceScreen pPreferenceScreen = (PreferenceScreen) findPreference("preferenceScreen"); PreferenceCategory pCategory = (PreferenceCategory) findPreference("personalisation"); ThemedPreference pThemePref = (ThemedPreference) findPreference("animation"); pPreferenceScreen.removePreference(pCategory); //remove category pCategory.removePreference(pThemePref); // remove preference
sumber
Saya merekomendasikan menggunakan preferensi v7, ini memiliki
setVisible()
metode. Tapi saya belum mencobanya. Dengan demikian Anda harus menggunakanPreferenceFragment
bukanPreferenceActivity
.sumber
getParent()
, jadi Anda benar-benar dapat menghapus preferensi seperti yang dijelaskan dalam jawaban ini .Dalam file XML Anda dapat membuat preferensi tersembunyi dengan mengosongkan tag judul dan ringkasan.
<EditTextPreference android:defaultValue="toddlerCam" android:key="save_photo_dir" />
sumber
Berikut adalah cara umum untuk melakukan ini yang berhasil terlepas dari apakah preferensinya di bawah
PreferenceCategory
atauPreferenceScreen
.private void removePreference(Preference preference) { PreferenceGroup parent = getParent(getPreferenceScreen(), preference); if (parent == null) throw new RuntimeException("Couldn't find preference"); parent.removePreference(preference); } private PreferenceGroup getParent(PreferenceGroup groupToSearchIn, Preference preference) { for (int i = 0; i < groupToSearchIn.getPreferenceCount(); ++i) { Preference child = groupToSearchIn.getPreference(i); if (child == preference) return groupToSearchIn; if (child instanceof PreferenceGroup) { PreferenceGroup childGroup = (PreferenceGroup)child; PreferenceGroup result = getParent(childGroup, preference); if (result != null) return result; } } return null; }
sumber
Karena
getParent()
metode Android API 26 tersedia: https://developer.android.com/reference/android/preference/Preference.html#getParent ()Meskipun Anda dapat melakukan hal berikut:
preference.getParent().removePreference(preference);
sumber
Anda dapat melakukannya dengan 2 cara:
1. Jika Anda menggunakan pustaka dukungan, Anda bisa membuat peta pohon preferensi dan orang tuanya, lalu menghapus preferensi dengan menggunakan induknya. Berikut fungsi untuk menghasilkan peta seperti itu:
public static Map<Preference, PreferenceGroup> buildPreferenceParentTree(@NonNull final PreferenceScreen preferenceScreen) { final Map<Preference, PreferenceGroup> result = new HashMap<>(); final Stack<PreferenceGroup> curParents = new Stack<>(); curParents.add(preferenceScreen); while (!curParents.isEmpty()) { final PreferenceGroup parent = curParents.pop(); final int childCount = parent.getPreferenceCount(); for (int i = 0; i < childCount; ++i) { final Preference child = parent.getPreference(i); result.put(child, parent); if (child instanceof PreferenceGroup) curParents.push((PreferenceGroup) child); } } return result; }
sumber
setVisible()
tersedia sejak versi 24.1.0 dari perpustakaan Dukungan.setVisibile()
metode ini tersedia dari android-x yang saya coba klarifikasi. Jangan tersinggung.Jika Anda ingin mengevaluasi, dan berdasarkan topeng itu, mungkin ada alternatif lain
SwitchPreference autenticacionUsuario = (SwitchPreference) findPreference("key_autenticacion_usuario"); final EditTextPreference Username = (EditTextPreference) findPreference("key_username_mqtt"); final EditTextPreference Password = (EditTextPreference) findPreference("key_password_mqtt"); if (!autenticacionUsuario.isChecked()) { PreferenceCategory preferenceCategory = (PreferenceCategory) findPreference("category_mqtt"); preferenceCategory.removePreference(Username); preferenceCategory.removePreference(Password); }
Semua ini harus ada di dalam
public static class PrefsFragment extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
sumber
Jika Anda melakukan apa yang menurut saya Anda coba lakukan (karena saya mencoba melakukannya sekarang) mungkin lebih baik mengaktifkan / menonaktifkan preferensi. Karena menghapusnya akan mengeluarkannya dari layar preferensi dan Anda mungkin tidak dapat menambahkannya kembali ke tempat yang Anda inginkan jika Anda membuat layar secara terprogram.
pref.setEnabled (false); pref.setEnabled (true);
meskipun ini mungkin sudah usang. Ini berfungsi untuk kasus penggunaan yang saya alami sekarang.
sumber