У меня есть активность, которая расширяет PreferenceActivity. Я загружаю настройки из файла xml. Но в некоторых случаях мне нужно полностью скрыть одно из предпочтений на экране в зависимости от состояния моего приложения. Существует метод setEnabled, но это не совсем то, что я хочу. Я хочу полностью удалить это предпочтение с экрана. Возможно ли это?Удалить/скрыть предпочтение с экрана
ответ
Да, если у вас есть ссылка на как Preference
, так и его родителей (а PreferenceCategory
или PreferenceScreen
)
myPreferenceScreen.removePreference(myPreference);
Если Preference
находится в PreferenceCategory
, вы должны сделать это:
XML:
<PreferenceCategory
android:key="category_foo"
android:title="foo">
<CheckBoxPreference
android:key="checkPref" />
Java:
CheckBoxPreference mCheckBoxPref = (CheckBoxPreference) findPreference("checkPref");
PreferenceCategory mCategory = (PreferenceCategory) findPreference("category_foo");
mCategory.removePreference(mCheckBoxPref);
Чтобы быть справедливым, в приведенном выше ответе говорится, что вам нужен родительский «PreferenceCategory». – matt
В том случае, когда предпочтение отдается прямым потомком экрана предпочтений, вот некоторые автономные код:
PreferenceScreen screen = getPreferenceScreen();
Preference pref = getPreferenceManager().findPreference("mypreference");
screen.removePreference(pref);
Это не будет работать, если предпочтение находится внутри категории. вы должны «findPreference» для этой категории и удалить предпочтение из категории – MBH
@MBH: Спасибо, что упомянули это предостережение! –
Если вы хотите что-то, что будет динамически изменять префов, например, на SwitchPreference , Я нашел, что лучший способ - поместить все мои вспомогательные опции в два контейнера категории. Сначала у вас будет все показанное, а затем вы просто удалите бит, который вам не нужен. Умный бит, вы просто запускаете воссоздание, когда что-то меняется, а затем вам не нужно ничего вручную создавать или беспокоиться о том, чтобы вернуть вещи в правильном порядке.
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();
}
}
Единственный недостаток, который я могу видеть это, это есть вспышка, как экран воссозданы с нуля.
Случай не работает, по крайней мере, не в 22. Но смена его на предпочтение (даже если это группировка предпочтений) работает. – Rob
Роб, я просто протестировал вышеуказанный код в AV22 API22, и он работает отлично. Убедитесь, что ваш XML-контент предпочтений соответствует вашему коду. Для вышеприведенного примера SwitchPreference может быть где угодно, но вам нужно, чтобы PreferenceCategorys были прямыми дочерними элементами PreferenceScreen. – James
Я только что получил категорию в качестве предпочтения, без приведения и снял ее. Работал. – Rob
Если вы хотите оценить, и на основе этой маски, альтернативой может быть/(Si deseas evaluar, у собственной базы ESO ocultar, уна Alternativa Puede сер):
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);
}
Все это должно быть в/(Todo Эсто Деб л Dentro):
общественный статический класс PrefsFragment расширяет PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Извините, но это английский сайт. Можете ли вы ответить на английском языке? –
Конечно, мое намерение состояло в том, чтобы обеспечить людей, которые не говорят по-английски –
@GustavoEduardoBelduma, тогда вам, возможно, потребуется прочитать это http://meta.stackoverflow.com/a/297680/545026 –
Вот общий способ сделать это, который работает независимо от того, предпочтение отдается PreferenceCategory
или PreferenceScreen
.
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;
}
Я рекомендую использовать предпочтение V7, оно имеет метод setVisible(). Но я еще не пробовал. Соответственно, вы должны использовать PreferenceFragment вместо PreferenceActivity https://developer.android.google.cn/reference/android/support/v7/preference/Preference.html#setVisible(boolean)
В файле XML:
<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>
В коде:
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
- 1. Заголовок изображения Предпочтение внизу экрана
- 2. Получите предпочтение яркости экрана в Android
- 3. Предпочтение деятельности с MenuDrawer
- 4. Предпочтение ориентации телефона в зависимости от размера экрана
- 5. Почему это разделяемое предпочтение не сохраняется при вращении экрана?
- 6. Предпочтение класса
- 7. mysql - Выбрать с "if" предпочтение
- 8. Вспоминая предпочтение пользователя с cookie
- 9. Предпочтение пользовательского диалога с RadioGroup
- 10. Предпочтение с опциями в строке
- 11. Диалоговое предпочтение с помощью переключателей
- 12. ключ Предпочтение всегда возвращают нуль
- 13. Предпочтение отключается самостоятельно в PreferenceActivity
- 14. Android ==> Предпочтение?
- 15. Android Предпочтение RadioGroup
- 16. Общий каталог Предпочтение - genymotion
- 17. Предпочтение производительности объекта Javascript
- 18. переключатель Предпочтение Compat не анимировать (Поддержка Предпочтение v7)
- 19. PdfPTable Предпочтение SplitRows false
- 20. Neo4j Рекомендатор Двигатель (Предпочтение)
- 21. SeekBar предпочтение изменение громкости
- 22. принудительное предпочтение const-версии?
- 23. Default Ringtone Предпочтение тихую
- 24. разделяемого предпочтение: Float
- 25. Сохранено предпочтение не получать
- 26. Как отдать предпочтение пользователю?
- 27. андроид разделяют предпочтение нулевой
- 28. предпочтение: флажок автоматически обновляется?
- 29. Общий Предпочтение ненормальное поведение
- 30. Android - Как установить предпочтение в коде
Мне любопытно, об этом тоже. –