Android - 如何在PreferenceFragment中隐藏控件

5
在我的偏好设置界面中,我需要根据特定条件隐藏某个偏好设置。
public class MyFragment extends PreferenceFragment {
  public void onCreate(Bundle state) {
    addPreferencesFromResource(...);
    ListPreference myList = (ListPreference) findPreference("myid");

    ...
    if (condition) {
      // hide myList
    }
 }

我似乎找不到在ListPreference或PreferenceFragment上隐藏它不显示在UI中的任何方法。如果您能指点我正确的方向,我将不胜感激。


可能是重复问题Android: ListPreference hide/disable value - Moog
我已经看过那个了。它讲的是在显示列表控件时隐藏值。在我的情况下,我希望删除控件本身。 - Peter
3个回答

12

经过大量调试,结果发现问题很简单。以下是需要做的:

首先,获取项所属的PreferenceCategory。接下来,只需在其上调用removePreference即可。

 PreferenceCategory myCategory = (PreferenceCategory) findPreference("myPrefCategory");
 myCategory.removePreference(myList);

如果ListPreference不属于任何类别,该怎么办? - sdabet

2

如果您想知道如何删除没有父类别的项目 - 您应该将根命名为这样:

<PreferenceScreen
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:key="root_preferences">
<PreferenceCategory
        android:title="Developer tools"
        android:key="dev_tools_category">

那么举个例子:
if (!BuildConfig.DEBUG) {
    PreferenceScreen rootPreferences = (PreferenceScreen) findPreference("root_preferences");
    PreferenceCategory devCategory = (PreferenceCategory) findPreference("dev_tools_category");
    rootPreferences.removePreference(devCategory);
}

在上面的例子中,“dev_tools_category”可以是任何喜好小部件,或者像我展示的那样 - 一个类别。

0

您可以直接使用来自Preference类的继承方法。

myList.setShouldDisableView(true);
myList.setEnabled(false);
第一个将在首选项禁用时使首选项的后备视图消失,第二个则实际禁用首选项。

这很接近了。然而,偏好设置对话框中的行项目仍然显示出来,尽管现在已经变灰。 - Peter
由于某些原因(可能是在Lollipop版本之前的版本中有效),此方法无法正常工作。偏好设置已被禁用。 - David Ferrand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接