如何pipe理PreferenceFragment中的分隔线?

我开始处理PreferenceFragment中的PreferenceFragment 。 这是我有:

my_preferences

我试图:

  1. 摆脱项目之间的分隔线。 我想这可以从风格来定义,但我不知道如何。 我试着在运行时调用findViewById(android.R.id.list)获取首选ListView ,因为我在某处读取,但它返回null。

  2. 如图所示,在标题顶部设置新的全宽分隔符。 例如,在这种情况下,我想在“Statistiche”上方设置一个完整宽度的分隔线,但不要在列表顶部的“Generali”之上。

我想到的唯一办法就是把分隔线设定为假的偏好,就像:

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

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

所以我的问题是:

  • 我怎样才能摆脱你可以在图像中看到的默认的项目分隔符?

  • 我怎样才能设置标题上方的全宽分隔符,或者我如何摆脱内部片段/活动填充? 当然,我的活动布局没有任何(明确的)填充。

Solutions Collecting From Web of "如何pipe理PreferenceFragment中的分隔线?"

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); } 

虽然有点晚了,我在preff屏幕上有与分隔符相同的麻烦,并find了这个解决scheme:设置自定义风格的托pipe活动,并添加到样式:

  <item name="android:listDivider">@null</item> 

它实际上是一样的设置它槽代码,但你保存一个findById,我认为它看起来更清晰的设置槽样式

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

 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; } } } 

你可能可以摆脱rootView检查,但同时你甚至可能想检查list != null 。 无论如何,我没有遇到任何NPE。

所以, setDivider(null)取消了item-item分隔setDivider(null) 。 我设法通过以下方式添加覆盖整个屏幕宽度的分区分隔符:

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

ñ

  <Preference android:title="divider" android:selectable="false" android:layout="@layout/preference_divider"/> 

对于PreferenceFragmentCompat,ListView不起作用。 但是这个工作就像一个魅力:

 <style name="PrefsTheme" parent="PreferenceThemeOverlay.v14.Material"> <item name="android:divider">@null</item> <item name="android:dividerHeight">0dp</item> </style> 

添加到您的应用程序主题:

 <item name="preferenceTheme">@style/PrefsTheme</item> 

如果您使用PreferenceFragment,则可以使用ListView。 setDivider(null) ; 如果使用PreferenceFragmentCompat,则可以使用PreferenceFragmentCompat。 setDivider(Drawable divider)setDividerHeight(int height) ;

新的android API 24及以上( 2017年12月25日 )的新解决scheme。

我已经find了多种方式在stackoverflow后,但没有工作,或者它只是工作,但不工作在最新的 PreferenceScreen

首先,你需要从当前显示的片段中findlistview,并删除divider:

 private fun removeDividerInCurrentFragment() { this@YourPreferenceActivity.fragmentManager.findFragmentById(android.R.id.content)?.let { it.view?.findViewById<ListView?>(android.R.id.list)?.let { it.divider = null it.dividerHeight = 0 } } } 

其次,在片段提交时删除分隔符,调用上面的方法( removeDividerInCurrentFragment )来删除列表视图的分隔符。

确定是否有最新的PreferenceScreen 。 通过实现FragmentManager.OnBackStackChangedListener协议,在PreferenceActivity更改片段时注册侦听器:

 class YourPreferenceActivity : PreferenceActivity(), FragmentManager.OnBackStackChangedListener { override fun onBackStackChanged() { this@YourPreferenceActivity.removeDividerInCurrentFragment() } } 

最后,在onCreate通过调用fragmentManager.addOnBackStackChangedListener(this@ YourPreferenceActivity)注册堆栈更改监听器。 并通过在onDestroyed方法中调用fragmentManager.removeOnBackStackChangedListener来移除堆栈更改监听器。

祝你好运!