自定义Preference布局
Preference 在 Android 设置相关的应用开发中非常常用,Preference 一般具有一个 title 和一个 summary 来对 Preference 进行描述。在一些其它的开发中,也常用到这样的布局——具有一个标题,标题下有一个具体的描述。故而可以借助Preference 来简化实现,或参考 Preference 的实现来开发自己的功能。
借助 Preference 来实现
Preference 的布局一般是在 XML 文件中书写 Screen 来实现的。这种方式布局是固定的,很难实现自定义的布局。 PreferenceFragment 的实现关键实现代码如下:
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
......
mLayoutResId = a.getResourceId(R.styleable.PreferenceFragmentCompat_android_layout,mLayoutResId);
......
final View view = themedInflater.inflate(mLayoutResId, container, false);
final View rawListContainer = view.findViewById(AndroidResources.ANDROID_R_LIST_CONTAINER);
if (!(rawListContainer instanceof ViewGroup)) {
throw new IllegalStateException("Content has view with id attribute "
+ "'android.R.id.list_container' that is not a ViewGroup class");
}
final ViewGroup listContainer = (ViewGroup) rawListContainer;
final RecyclerView listView = onCreateRecyclerView(themedInflater, listContainer, savedInstanceState);
......
可以看到其布局是通过 android:layout
来设置的,所以可以设置一个主题,在主题中指定布局。布局中要有一个名为AndroidResources.ANDROID_R_LIST_CONTAINER
的 container 即可。
定义一个主题
定义个主题,主题中指定android:layout
,即自定义的布局即可,然后将这个布局应用到需要Activity
上即可。
<style name="Theme.XXX.XXX" parent="Theme.XXX">
<item name="android:layout">@layout/XXX</item>
</style>
自己实现
查看 Preference 的源码可以发现Android 的实现是通过 List 和 Adapter 来绑定 解析后的 XML数据来实现的,所以可以自定义XML 的解析器,生成需要显示的数据,然后用Adapter 来胜场每个条目的显示布局。
注意点
文字的国际化问题
XmlResourceParser.getAttributeValue() // 获取数据不会自动国际化
// 实现国际化
private inline fun getResourceString(nameSpace: String?, attribute: String): String{
val resId = xmlParser.getAttributeResourceValue(nameSpace, attribute, -1)
return context.getString(resId)
}