从屏幕中删除/隐藏首选项

Ale*_*voy 133 android preferences

我有一个扩展PreferenceActivity的活动.我正在从xml文件加载首选项.但在某些情况下,我需要根据我的应用状态完全隐藏屏幕中的一个偏好设置.有一个setEnabled方法,但它不是我想要的.我想完全从屏幕上删除该首选项.可能吗 ?

Kav*_*avi 207

如果你Preference在a之内PreferenceCategory,你必须这样做:

XML:

<PreferenceCategory
    android:key="category_foo"
    android:title="foo">

    <CheckBoxPreference
        android:key="checkPref" />
Run Code Online (Sandbox Code Playgroud)

Java的:

CheckBoxPreference mCheckBoxPref = (CheckBoxPreference) findPreference("checkPref");
PreferenceCategory mCategory = (PreferenceCategory) findPreference("category_foo");
mCategory.removePreference(mCheckBoxPref);
Run Code Online (Sandbox Code Playgroud)

  • 公平地说,上面的答案确实说你需要父"PreferenceCategory". (4认同)

Dav*_*und 171

是的,如果您同时引用了Preference它的父元素(a PreferenceCategory,或PreferenceScreen)

myPreferenceScreen.removePreference(myPreference);
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,它永久删除了偏好。有没有可能只是隐藏它? (2认同)

1''*_*1'' 47

如果Preference是首选项屏幕的直接子项,则以下是一些独立代码:

PreferenceScreen screen = getPreferenceScreen();
Preference pref = getPreferenceManager().findPreference("mypreference");
screen.removePreference(pref);
Run Code Online (Sandbox Code Playgroud)

  • 如果首选项位于类别内,则此方法不起作用.你必须为类别"findPreference",并从类别中删除首选项 (3认同)

小智 8

如果你想要一些动态改变prefs的东西,例如在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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我能看到的唯一缺点就是有一个闪存,因为屏幕是从头开始重新创建的.


小智 8

在您的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>
Run Code Online (Sandbox Code Playgroud)

在你的代码中:

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
Run Code Online (Sandbox Code Playgroud)


小智 7

我推荐使用 v7 偏好,它有setVisible()方法。但我还没有尝试过。因此,您必须使用PreferenceFragment代替PreferenceActivity.


aar*_*gas 5

如果使用的是PreferenceFragmentCompat,则可以在xml中设置可见性。

xml中的首选项将自动转换为AppCompat版本。然后,您可以在xml中使用' app:isPreferenceVisible '属性

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" />

...
Run Code Online (Sandbox Code Playgroud)

该属性记录在https://developer.android.com/guide/topics/ui/settings/components-and-attributes

PreferenceFragmentCompathttps://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();
    }
} 
Run Code Online (Sandbox Code Playgroud)

  • 这才是正确答案!!OP 要求隐藏偏好,而不是删除。 (2认同)