2018年8月15日 星期三

Android 在 preference category 中間加入分隔線

在 Android material design 中關於 settings 的建議是這樣的,不要為個別的 preference item 加分隔線,只要在 preference group 之間加入分隔線就好



preference item 預設是有分隔線的,所以需要把它取消,取消的方法很簡單,只要用 setDivider 就好
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    setDivider(null);
    super.onViewCreated(view, savedInstanceState);
} 
但是要在 preference group 之間要加入分隔線卻沒有那麼容易,Android 沒有提供簡單的方法可以用,一個比較正統的作法可能是取得 PreferenceFragmentCompat 內的 RecyclerView 然後用 DividerItemDecoration 來畫出分隔線

DividerItemDecoration 是 Android 官方提供的為 RecyclerView 劃出分隔線的方式,之前也有介紹過,但是這樣要寫太多的 code 了,而且還要自己判斷 RecyclerView 中的 item 是不是 PreferenceCategory,只是為了要加分隔線而已,這樣搞太複雜

一個簡單的方式是,自己在 preference layout 檔中加入一個 PreferenceCategory,並且讓這個 PreferenceCategory 套用我們自己做的客製化的 layout
<android.support.v7.preference.PreferenceCategory
    android:layout="@layout/preference_divider">
</android.support.v7.preference.PreferenceCategory>
在客製化 layout 中用 View 來當分隔線
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:orientation="vertical">
    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="?android:attr/listDivider"/>
</LinearLayout>
這樣基本上就可以符合 Android material settings 的形式了,不過很奇怪為什麼 Android 既然自己提倡 material settings 這樣設計,為什麼沒有提供一個簡單的方法來讓開發者使用?還要自己做一個 layout 檔來 workaround,真的不知道該說甚麼

沒有留言:

張貼留言