一个完美的冷启动选择标签的写法
说明:
① 不采用第一次进入让选标签的方法,而是先进入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()
}
效果如图: