Kotlin云头条技术点剖析(项目复习02)——用户协议页面

SplashActivity中的showTermServiceAgreementDialog() 也就是同意协议页面

没有同意用户协议 同意协议页面出现在当前页面供用户选择

kotlin 复制代码
private fun showTermServiceAgreementDialog() {
        TemServiceDialogFragment.show(supportFragmentManager) {
            DefaultPreferenceUtil.getInstance(this).setAcceptTermsServiceAgreement()
            requestPermission()
        }
    }

DefaultPreferenceUtil(偏好设置工具类)是否登录了,是否显示引导界面,用户Id

kotlin 复制代码
/**
 * 偏好设置工具类
 * 是否登录了,是否显示引导界面,用户Id
 */
class DefaultPreferenceUtil(context: Context) {
    private var context: Context
    private val preference: SharedPreferences

    init {
        //保存上下文
        this.context = context.applicationContext
        //这样写有内存泄漏
        //因为当前工具类不会马上释放
        //如果当前工具类引用了界面实例
        //当界面关闭后
        //因为界面对应在这里还有引用
        //所以会导致界面对象不会被释放
        //this.context = context
        //获取系统默认偏好设置,在设置界面保存的值就可以这样获取
        preference = PreferenceManager.getDefaultSharedPreferences(this.context)

        //自定义名称
//        preference = this.context.getSharedPreferences(NAME, Context.MODE_PRIVATE)
    }
    //region 用户协议
    /**
     * 设置同意了用户协议
     */
    fun setAcceptTermsServiceAgreement() {
        putBoolean(TERMS_SERVICE, true)
    }
    /**
     * 获取是否同意了用户条款
     *
     * @return
     */
    val isAcceptTermsServiceAgreement: Boolean
        get() = preference.getBoolean(TERMS_SERVICE, false)
    //endregion
    /**
     * 移动网络下是否播放
     *
     * @return 默认不能播放
     */
    val isMobileNetworkPlay: Boolean
        get() = preference.getBoolean(KEY_MOBILE_NETWORK_PLAY, false)
    //region 辅助方法
    private fun putBoolean(key: String, value: Boolean) {
        preference.edit().putBoolean(key, value).apply()
    }
    //endregion
    companion object {
        /**
         * 偏好设置文件名称
         */
        private const val NAME = "Yun_News"
        private const val TERMS_SERVICE = "TERMS_SERVICE"
        private const val KEY_MOBILE_NETWORK_PLAY = "mobile_network_play"
        private var instance: DefaultPreferenceUtil? = null
        /**
         * 获取偏好设置单例
         *
         * @param context
         * @return
         */
        @Synchronized
        fun getInstance(context: Context): DefaultPreferenceUtil {
            if (instance == null) {
                instance = DefaultPreferenceUtil(context)
            }
            return instance!!
        }
    }
}

BaseDialogFragment 父类 与BaseActivity作用一样

kotlin 复制代码
abstract class BaseDialogFragment:DialogFragment() {
    //找控件
    protected open fun initViews(){}
    //设置数据
    protected open fun initDatum(){}
    //设置监听器
    protected open fun initListeners(){}
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        //获取view
        val view = getLayoutView(inflater, container, savedInstanceState)
        return view
    }
    //重写子类
    open abstract fun getLayoutView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View?
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        initViews()
        initDatum()
        initListeners()
    }
}

TemServiceDialogFragment

kotlin 复制代码
class TemServiceDialogFragment:BaseViewModelDialogFragment<FragmentDialogTermServiceBinding>() {
    private lateinit var onAgreementClickListener: View.OnClickListener


    @SuppressLint("SuspiciousIndentation")
    override fun initViews() {
        super.initViews()
        //点击窗外不能被关闭
        isCancelable = false

        //设置文本中超链接的颜色
        SuperTextUtil.setLinkColor(binding.content1,getColor(requireContext(),R.color.link))


    }

    override fun initDatum() {
        super.initDatum()
        //z在fragment中的数据函数中实现对有特殊格式的文字进行解析
        val content1 = Html.fromHtml(getString(R.string.term_service_privacy_content))
        binding.content1.text = content1
    }

    //回调调用这个接口
    override fun initListeners() {
        super.initListeners()
        binding.primary.setOnClickListener {
            dismiss()//点击关闭按钮 避免内存泄漏
            onAgreementClickListener.onClick(it)
        }
        binding.disagree.setOnClickListener {
            dismiss()
            //杀死当前应用
            SuperProcessUtil.killApp()
        }
    }
    //onResume的意思是一直循环 让窗口扩展到一定的长和宽
    override fun onResume() {
        super.onResume()
        val params: ViewGroup.LayoutParams = dialog!!.window!!.attributes
        params.width = ((ScreenUtil.getScreenWith(requireContext()) * 0.9).toInt())
        params.height = ViewGroup.LayoutParams.WRAP_CONTENT
        dialog!!.window!!.attributes = params as WindowManager.LayoutParams
    }


//companion object 是 Kotlin 中实现类级别静态成员的方式
    companion object {
        // 显示对话框
        @SuppressLint("SuspiciousIndentation")
        fun show(supportFragmentManager: FragmentManager,onAgreementClickListener:View.OnClickListener) {
         val dialogFragment = TemServiceDialogFragment()
            dialogFragment.onAgreementClickListener= onAgreementClickListener
            dialogFragment.show(supportFragmentManager,"TemServiceDialogFragment")
        }
    }
}

SuperTextUtil(设置富文本,超链接颜色)

kotlin 复制代码
object SuperTextUtil {

    //设置富文本,超链接颜色
    fun setLinkColor(view:TextView,color:Int){
        //设置后才可以点击
        view.setMovementMethod(LinkMovementMethod.getInstance())
        //链接的颜色
        view.setLinkTextColor(color)
    }
}

SuperProcessUtil (杀死当前应用)

kotlin 复制代码
object SuperProcessUtil {
    //杀死当前应用
    fun killApp(){
        Process.killProcess(Process.myPid())
    }
}

BaseViewModelDialogFragment 作用跟BaseViewActivity一模一样 为了减少生成setconview 减少重复的代码 提高可读性

kotlin 复制代码
abstract class BaseViewModelDialogFragment<VB : ViewBinding> : BaseCommonDialogFragment() {
    private var _binding: VB? = null
    protected val binding get() = _binding!!

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        _binding = ReflectUtil.newViewBinding(layoutInflater, this.javaClass)
    }

    override fun getLayoutView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        return binding.root
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
}
相关推荐
报错小能手19 小时前
深入理解 Linux 虚拟内存管理
开发语言·操作系统
Grackers20 小时前
Android Perfetto 系列 5:Android App 基于 Choreographer 的渲染流程
android
踩着两条虫20 小时前
AI驱动的Vue3应用开发平台深入探究(十):物料系统之内置组件库
android·前端·vue.js·人工智能·低代码·系统架构·rxjava
和沐阳学逆向20 小时前
我现在怎么用 CC Switch 管中转站,顺手拿 Codex 举个例子
开发语言·javascript·ecmascript
sam.li20 小时前
JADX MCP 原理与使用部署
android·逆向·jadx
小仙女的小稀罕20 小时前
听不清重要会议录音急疯?这款常见AI工具听脑AI精准转译
开发语言·人工智能·python
书到用时方恨少!20 小时前
Python random 模块使用指南:从入门到精通
开发语言·python
冬奇Lab20 小时前
Android 15音频子系统(五):AudioPolicyService策略管理深度解析
android·音视频开发·源码阅读
客卿12320 小时前
牛客刷题--找数字-- 字符串检测-字符串 双指针
java·开发语言
亚历克斯神21 小时前
Flutter for OpenHarmony: Flutter 三方库 mutex 为鸿蒙异步任务提供可靠的临界资源互斥锁(并发安全基石)
android·数据库·安全·flutter·华为·harmonyos