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
    }
}
相关推荐
周杰偷奶茶1 小时前
【Java】数组的定义和使用(附管理系统实战案例)
java·开发语言
橙子圆1232 小时前
JUC之集合类不安全
java·开发语言
阿里嘎多学长2 小时前
2026-09-29 GitHub 热点项目精选
开发语言·程序员·github·代码托管
Bruce_Liuxiaowei2 小时前
网页版 DeepSeek “harness desktop“ WebGL 上下文创建失败排查实录
开发语言·javascript·webgl
LCD液晶屏2 小时前
京瓷液晶屏停产替代:杭州立煌科技工业 LCD 解决方案
android·科技
狗凯之家源码网2 小时前
PHP 用户反馈系统源码深度评测与实战指南
开发语言·php·用户反馈系统
谢亮_vipxieliang3 小时前
Stream API 不是银弹:常见坑与性能建议
java·开发语言
迅猛龙办公室3 小时前
实现第一个python程序(HelloWorld)
开发语言·python
phltxy3 小时前
C 语言动态内存管理:从申请空间到安全释放
c语言·开发语言·ui
可乐鸡翅yeah_3 小时前
M3U8 防盗链 URL‑Token 签名,新手开发实操避坑
开发语言·javascript·ios·音视频·safari