Удалить / скрыть настройки с экрана - PullRequest
129 голосов
/ 11 февраля 2010

У меня есть действие, которое расширяет PreferenceActivity. Я загружаю настройки из файла XML. Но в некоторых случаях мне нужно полностью скрыть одно из предпочтений на экране в зависимости от состояния моего приложения. Есть метод setEnabled, но это не совсем то, что я хочу. Я хочу полностью удалить это предпочтение с экрана. Возможно ли это?

Ответы [ 12 ]

203 голосов
/ 18 апреля 2011

Если ваш 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);
170 голосов
/ 11 февраля 2010

Да, если у вас есть ссылка как на Preference, так и на его родителя (a PreferenceCategory или PreferenceScreen)

myPreferenceScreen.removePreference(myPreference);
45 голосов
/ 17 сентября 2013

В случае, когда предпочтение является прямым потомком экрана предпочтений, вот некоторый автономный код:

PreferenceScreen screen = getPreferenceScreen();
Preference pref = getPreferenceManager().findPreference("mypreference");
screen.removePreference(pref);
8 голосов
/ 16 февраля 2015

Если вы хотите что-то, что будет динамически изменять префиксы, например, в 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();
    }
}

Единственный недостаток, который я вижу при этом, - это вспышка, поскольку экран воссоздается с нуля.

7 голосов
/ 24 июля 2017

В вашем 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
4 голосов
/ 12 января 2019

Если вы используете 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();
    }
} 
4 голосов
/ 09 июня 2017

Я рекомендую использовать предпочтение v7, у него есть метод setVisible(). Но я еще не пробовал. Соответственно, вы должны использовать PreferenceFragment вместо PreferenceActivity.

2 голосов
/ 17 апреля 2018

В файле XML вы можете сделать скрытые настройки, оставив теги заголовка и резюме пустыми.

<EditTextPreference
    android:defaultValue="toddlerCam"
    android:key="save_photo_dir"
/>
2 голосов
/ 25 мая 2017

Вот общий способ сделать это, который работает независимо от того, находится ли предпочтение под 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;
}
1 голос
/ 14 сентября 2018

Поскольку Android API 26 getParent() метод доступен: https://developer.android.com/reference/android/preference/Preference.html#getParent()

Хотя вы можете сделать следующее:

preference.getParent().removePreference(preference);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...