如何管理PreferenceFragment中的分隔符?

nat*_*rio 16 android android-preferences android-listview android-fragments

我开始处理a中的偏好PreferenceFragment.这就是我所拥有的:

my_preferences

我试着:

  1. 摆脱物品之间的分隔物.我想这可以从样式中定义,但我无法弄清楚如何.我尝试ListView在运行时调用 获取首选项findViewById(android.R.id.list),因为我在某处读取,但它返回null.

  2. 设置新的,全宽有权在头顶部分隔,如看到这里.例如,在这种情况下,我想在"Statistiche"上方的全宽度分隔符,但不在列表顶部的"Generali"之上.

我想到的唯一方法是将分隔线设置为假偏好,例如:

<Preference
    android:layout="@layout/divider" //here I set width and a divider resource
    />

<PreferenceCategory ... />
Run Code Online (Sandbox Code Playgroud)

这里的主要问题是我的PreferenceFragment(或者ActionBarActivity它的)有一些左/右填充,这使得我添加到preferences.xml中的任何分隔符都不会覆盖整个宽度.

所以我的问题是:

  • 如何摆脱图片中可以看到的默认项目分项?

  • 如何在标题上方设置全宽分隔符,或者如何摆脱内部片段/活动填充?当然,我的活动布局没有任何(显式)填充.

Sag*_*Low 25

在以下代码下添加此代码PreferenceFragment:

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        // remove dividers
        View rootView = getView();
        ListView list = (ListView) rootView.findViewById(android.R.id.list);
        list.setDivider(null);

    }
Run Code Online (Sandbox Code Playgroud)

  • 完善!快速,简单,简短.我遇到的每一个其他答案(甚至没有用)都显得过分.谢谢! (4认同)

Mak*_*nov 17

AndroidX使它变得简单,但希望对其进行更好的记录。

在XML中

要在XML首选项之间添加/删除分隔符,请使用以下属性:

<androidx.preference.PreferenceScreen
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <Preference
        ...
        app:allowDividerAbove="true/false"
        app:allowDividerBelow="true/false"
        ... />

</androidx.preference.PreferenceScreen>
Run Code Online (Sandbox Code Playgroud)

请注意,只有顶部分隔线allowDividerBelow设置为true,底部分隔线allowDividerAbove设置为,分隔线才会显示在两个首选项之间true

在代码中

您也可以更改/删除程序分频器使用以下方法onActivityCreated您的PreferenceFragmentCompat

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    // To remove:
    setDivider(null);

    // To change:
    setDivider(ContextCompat.getDrawable(getActivity(), R.drawable.your_drawable));
    setDividerHeight(your_height);
}
Run Code Online (Sandbox Code Playgroud)


X3B*_*tel 11

虽然有点晚了我在preff屏幕上遇到了与分隔器相同的麻烦并找到了这个解决方案:将自定义样式设置为托管活动并添加到样式:

   <item name="android:listDivider">@null</item>
Run Code Online (Sandbox Code Playgroud)

它实际上与通过代码设置相同,但你保存一个findById,我认为它看起来更清晰


nat*_*rio 7

已经完全忘记了这个问题,现在会发布一个答案来帮助别人.我通过在onResume()托管我的活动的方法中移动我的代码来解决PreferenceFragment.我认为还有其他几点你可以回忆起非null ListView使用findViewById(android.R.id.list).

public boolean mListStyled;

@Override
public void onResume() {
    super.onResume();
    if (!mListStyled) {
        View rootView = getView();
        if (rootView != null) {
            ListView list = (ListView) rootView.findViewById(android.R.id.list);
            list.setPadding(0, 0, 0, 0);
            list.setDivider(null);
            //any other styling call
            mListStyled = true;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

你可能可以摆脱rootView支票,但同时你甚至可能想要检查list != null.无论如何,我没有这样面对任何NPE.

所以,setDivider(null)取下项目分隔线.我设法通过以下方式添加覆盖屏幕整个宽度的分区分隔符:

  • 去除填充list;
  • 在我的XML中添加自定义首选项:

ñ

 <Preference
     android:title="divider"
     android:selectable="false"
     android:layout="@layout/preference_divider"/>
Run Code Online (Sandbox Code Playgroud)