У меня есть активность, которая расширяет PreferenceActivity. Я загружаю настройки из xml файла. Но в некоторых случаях мне нужно полностью скрыть одно из предпочтений на экране в зависимости от состояния моего приложения. Существует метод setEnabled, но это не совсем то, что я хочу. Я хочу полностью удалить это предпочтение с экрана. Возможно ли это?
Удаление/скрытие предпочтений с экрана
Ответ 1
Да, если у вас есть ссылка как на Preference
, так и на родителя (a PreferenceCategory
или PreferenceScreen
)
myPreferenceScreen.removePreference(myPreference);
Ответ 2
Если ваши Preference
находятся в PreferenceCategory
, вы должны сделать это:
XML:
<PreferenceCategory
android:key="category_foo"
android:title="foo">
<CheckBoxPreference
android:key="checkPref" />
Джава:
CheckBoxPreference mCheckBoxPref = (CheckBoxPreference) findPreference("checkPref");
PreferenceCategory mCategory = (PreferenceCategory) findPreference("category_foo");
mCategory.removePreference(mCheckBoxPref);
Ответ 3
В случае, когда Preference является прямым дочерним элементом экрана предпочтений, вот какой-то отдельный код:
PreferenceScreen screen = getPreferenceScreen();
Preference pref = getPreferenceManager().findPreference("mypreference");
screen.removePreference(pref);
Ответ 4
Если вы хотите что-то, что будет динамически изменять префизы, например, в 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();
}
}
Единственный недостаток, который я вижу с этим, - это вспышка, когда экран воссоздается с нуля.
Ответ 5
В вашем 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
Ответ 6
Я рекомендую использовать предпочтение v7, у него есть метод setVisible()
. Но я еще не пробовал. Соответственно, вы должны использовать PreferenceFragment
вместо PreferenceActivity
.
Ответ 7
В файле XML вы можете сделать скрытые предпочтения, оставив теги заголовка и резюме пустыми.
<EditTextPreference
android:defaultValue="toddlerCam"
android:key="save_photo_dir"
/>
Ответ 8
Вот общий способ сделать это, который работает независимо от того, является ли предпочтение под 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;
}
Ответ 9
Если вы хотите оценить, и на основе этой маски, альтернативой может быть
(Si deseas Assessment, y en base eso ocultar, una alternativa puede ser):
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 Esto Debe IR Dentro):
public static class PrefsFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Ответ 10
Поскольку Android API 26 доступен метод getParent()
: https://developer.android.com/reference/android/preference/Preference.html#getParent()
Хотя вы можете сделать следующее:
preference.getParent().removePreference(preference);
Ответ 11
Вы можете сделать это двумя способами:
1.Если вы используете библиотеку поддержки, вы можете построить карту дерева предпочтений и их родителей, а затем удалить предпочтение с помощью его родителя. Вот функция для генерации такой карты:
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;
}
- Если вы используете новый API настроек android-x, вы можете просто установить видимость, используя для этого функцию setVisible.
Ответ 12
Если вы используете PreferenceFragmentCompat, вы можете установить видимость в xml.
Настройки в вашем xml будут автоматически преобразованы в версии AppCompat. Затем вы можете использовать атрибут app: isPreferenceVisible в своем XML
preferences.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" />
...
Атрибут задокументирован по адресу https://developer.android.com/guide/topics/ui/settings/components-and-attributes.
Добавление PreferenceFragmentCompat
описано на https://developer.android.com/guide/topics/ui/settings/#inflate_the_hierarchy
Пример:
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();
}
}