9

我開始在PreferenceFragment處理首選項。下面是我有:如何管理PreferenceFragment中的分隔線?

my_preferences

我想:

  1. 擺脫項目之間的分割。我想這可以從樣式中定義,但我不知道如何。我嘗試在運行時調用 findViewById(android.R.id.list)獲得 首選項ListView,因爲我在某處讀取,但它 返回null。

  2. 設置新的,全寬分隔符正好在標題頂部,如所見here。例如,在這種情況下,我需要在「Statistiche」上方的全寬分隔線,但不要超出列表頂部的「Generali」。

這使我想到的唯一的辦法是設置分隔爲假的喜好,像:

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

<PreferenceCategory ... /> 

這裏的主要問題是,我PreferenceFragment(或它在ActionBarActivity)有一定的左/右填充,這使得我添加到preferences.xml 不是覆蓋整個寬度的任何分隔線。

所以我的問題是:

  • 我怎樣才能擺脫默認情況下,項項分隔,可以在圖像中看到了什麼?

  • 如何在標題上方設置全寬分隔符,或者如何刪除內部片段/活動填充?當然,我的活動佈局沒有任何(明確的)填充。

+0

嗨,你有沒有得到答案?如果你有這個問題,你可以幫忙解決嗎? – Naruto

+0

@Naruto總之我使用了'list = findViewById(android.R.id.list)',然後是'list.setDivider(null)'。爲了避免NPE,你需要調用這個'onResume'而不是'onCreate'。至於另一個問題,我會嘗試今天發佈一個完整的答案。 – natario

+0

嘿,謝謝你的回覆。我正在使用片段而不是活動。即我的類看起來像'公共類SettingsFragment擴展PreferenceFragment'。那麼在這種情況下我們該如何實現?任何幫助。 – Naruto

回答

7

本來完全忘記了這個問題,將發佈一個答案,現在去幫助別人。我通過在託管我的PreferenceFragment的活動的onResume()方法中移動我的代碼來解決此問題。我認爲還有其他幾點您可以使用findViewById(android.R.id.list)回憶非空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)取消了物品分隔符。我設法添加覆蓋整個屏幕寬度的部分分隔符:

  • list中刪除填充;
  • 添加在我的XML定製的偏好:

ň

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

我做到了,但不在列表中顯示分隔線,請幫助我。謝謝! –

+0

在API 21之後返回recyclerview,如果'android.R.id.list'將被搜索。 PreferenceFragmentCompat的onStart中的setDivider(null)應該有所幫助。 – Fattum

+0

你可以分享你的'preference_divider.xml'嗎? – Zoker

16

添加該代碼下的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); 

    } 
+4

完美!快速,簡單,簡短。我遇到過的每一個其他答案(甚至都不起作用)似乎過分了。謝謝! –

+0

我們是否必須創建一個列表視圖,然後將每個元素設置爲相同的佈局? –

+0

ANDROID 21之後,RecyclerView用於顯示基於列表的內容,因此R.id.list會刪除一個RecyclerView引用,該引用無法像我們使用ListView一樣進行處理。 – Fattum

9

雖然具有preff屏幕分隔相同的煩惱有點晚了我真的發現這樣的解決方案: 設置自定義樣式主辦活動,並添加到樣式:

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

它實際上等同於設置它低谷的代碼,但你救一個findById和我認爲它看起來更清晰的設置槽樣式

+0

太棒了。最簡單的一個。 –

1

對於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> 
0

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

0

新的android API 24及以上版本的新解決方案(2017年12月25日)。

我發現在嘗試了很多方法後在stackoverflow,但沒有工作,或者它只是工作,但不工作在最新PreferenceScreen

弗里斯特,你需要從當前顯示片段找到列表視圖,並刪除分隔:

private fun removeDividerInCurrentFragment() { 
    [email protected](android.R.id.content)?.let { 
     it.view?.findViewById<ListView?>(android.R.id.list)?.let { 
      it.divider = null 
      it.dividerHeight = 0 
     } 
    } 
} 

其次,除去當片段COMMITED分頻器,上述(removeDividerInCurrentFragment)調用方法來刪除ListView的分頻器。

確定您是否有最新版本PreferenceScreen

class YourPreferenceActivity : PreferenceActivity(), FragmentManager.OnBackStackChangedListener { 
    override fun onBackStackChanged() { 
     [email protected]() 
    } 
} 

最後,通過調用fragmentManager.addOnBackStackChangedListener([email protected] YourPreferenceActivity)onCreate寄存器堆棧中的變化監聽器:當片段在PreferenceActivity改變通過實施FragmentManager.OnBackStackChangedListener協議註冊偵聽器。並通過調用fragmentManager.removeOnBackStackChangedListeneronDestroyed方法中移除後臺更改監聽器。

祝你好運!

0

您可以使用此主題重新設計您的分隔線。

<style name="PreferenceFragment.Material"> 
    <item name="android:divider">@drawable/preference_list_divider_material</item> 
</style>