一个完美的冷启动选择标签的写法

说明:

① 不采用第一次进入让选标签的方法,而是先进入APP,然后以首页banner的形式让用户去选择。“提示选择”和“选择”都写在fragment里面。

② 采用sharedPreference保存选择的标签,存为Boolean。

③ 标签存在String.xml里面。

④ 标签以ChipGroup的形式展现。

重点在于向ChipGroup动态添加chip,否则一个一个在layout里面加,太不优雅了。

<resources>
    <string-array name="tag_list">
        <item>系统工具</item>
        <item>桌面插件</item>
        <item>主题美化</item>
        <item>社交聊天</item>
    </string-array>
</resources>

遍历标签Array,然后使用addview添加chip,同时由sharedPreference里面已保存的值设置标签选中状态,方便重新选择的时候可以看到之前选择的。

// 计数
var checkedTagNum = 0
// 动态添加 chip
resources.getStringArray(R.array.tag_list).forEach {

    val chip = Chip(
        context, null, R.attr.chipStandaloneStyle
    ).apply {
        text = it
        isCloseIconVisible = false
        // 设置默认选中状态
        if (prefsRead.getBoolean(it,false)){
            isChecked = true
        }
    }
    // 添加 chip
    chip_group_tag.addView(chip)
    // 在 SharedPreferences 里面存boolean表示选择状态,初始 false
    prefs.putBoolean( it, false )
}

点击提交选择结果按钮后,需要更新SharedPreferences里面已选择的标签。

submit_tag.setOnClickListener {

            for(chip in chip_group_tag){
                val chipItem = chip as Chip
                if (chipItem.isChecked){
                    prefs.putBoolean( chipItem.text.toString(), true )
                    checkedTagNum++
                }
            }
            prefs.apply()

            parentFragmentManager
                .beginTransaction()
                .remove(this)
                .commit()
            Toast.makeText(MyApplication.context, "已选择${checkedTagNum}个标签,可在个人界面修改选取!", Toast.LENGTH_LONG).show()
}

最终,文件系统里SharedPreferences存的东西长这样:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <boolean name="时尚购物" value="false" />
    <boolean name="影音娱乐" value="false" />
    <boolean name="运动健康" value="true" />
</map>

冷启动时,之让其在第一次打开时出现,使用sharedPreference的contains方法来办到:

// 这个sharedPreference不包括任一项,说明还没选过,此时呈现fragment
if (!requireContext().getSharedPreferences("choosenTagList", Context.MODE_PRIVATE).contains("社交聊天")){
    // 先提醒
    requireActivity().supportFragmentManager
    .beginTransaction()
    .replace(R.id.fragment_in_page_default, RemindToGoToChooseFragment(), null)
    .addToBackStack(null)
    .commit()
}

效果如图:

image-20220416054652937