Android 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)
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值