kotlin实现 Activity和Fragment高频代码较好的实现

Activity间的数据传递

Intent传递数据

  val intent = Intent(context, TranslucentActivity::class.java).apply {
                putExtra(Const.IntentParamsKey.OBJECT_ID, objectId)
            }
            context.startActivity(intent)

intent数据获取采用 by实现lazy加载或自定义委托实现

  private val objectId: Int by lazy {
        intent.getIntExtra(Const.IntentParamsKey.OBJECT_ID, 0)
    }

Activity传递数据到Fragment

使用Bundle传递

 companion object {

        fun newInstance(objectId: Int): SignDialogFragment {
            val fragment = SignDialogFragment()
            val args = Bundle()
            args.putInt(Const.IntentParamsKey.OBJECT_ID,objectId)
            return fragment
        }
    }
    

获取据获取采用 by实现lazy加载或自定义委托实现

  private val mObjectId: Int by lazy {
        arguments?.getInt(Const.IntentParamsKey.OBJECT_ID, 0) ?: 0
    }
    

Fragment传递数据到Activity

定义接口,在Activity实现,Fragment 转换,持有接口的引用,在需要的时候,调用回调到Activity
在onAttach进行转换

    override fun onAttach(context: Context) {
        super.onAttach(context)
        listener = context as? AddRemarkListener
        if (listener == null) {
            throw  ClassCastException("$context must implement AddRemarkInfoListener")
        }
    }

Activity于Fragment声明周期联动

按着Fragment生命周期顺序进行

  • onAttach() 与 Activity 关联时进行调用(Activity 传递到此方法内)

  • onCreateView() 调用它可创建与Fragment关联的视图层次结构

  • onActivityCreated() 当 Activity 的 onCreate() 方法已返回时进行调用

  • onStart

  • onResume

  • onPause

  • onStop

    onStart 到 onStop 之间 Activity 收到时,Activity 中的每个Fragment也会收到

  • onDestoyView 在移除与Fragment关联的视图层次结构时进行调用。

  • onDestory Activity 收到时,Activity 中的每个Fragment也会收到

  • onDetach 在取消Fragment与 Activity 的关联时进行调用。

采用顶层扩展函数抽象Fragment添加,替代查找方法

顶层函数和属性定义在kotlin文件中,和java的static修饰方法属性相当

inline fun FragmentManager.inTransaction(func: FragmentTransaction.() -> FragmentTransaction){
    beginTransaction().func().commit()
}

inline fun FragmentActivity.addFragment(fragment: Fragment, frameId: Int, tag: String){
    supportFragmentManager.inTransaction { add(frameId,fragment,tag) }
}

inline fun FragmentActivity.findFragmentByTag(tag:String): Fragment?{
    return supportFragmentManager.findFragmentByTag(tag)
}

inline fun FragmentActivity.replaceFragment(fragment: Fragment, frameId: Int){
    supportFragmentManager.inTransaction { replace(frameId,fragment) }
}

注意由于定义的是Activity的扩展属性,需要在Activity或者通过activty实例调用

在kotlin中 通过import 包+方法后直接使用了
java中调用, 需要在kotlin文件的package前通过 @file: JvmName(“KotlinUtils”) 定义java中调用的类名

看下具体代码例子
实现截图的效果在这里插入图片描述

先进入透明的Activty,弹出DialogFragment,在DialogFragment 加载个Fragment,点击上传图片从底部弹出框

class TranslucentActivity : BaseRxActivity(), SignDialogFragment.AddRemarkListener, AttachmentListener {

    private val objectId: Int by lazy {
        intent.getIntExtra(Const.IntentParamsKey.OBJECT_ID, 0)
    }
    private var mAttachments: MutableList<Attachment>? = ArrayList()

    companion object {
        fun start(context: Context, objectId: Int) {
            val intent = Intent(context, TranslucentActivity::class.java).apply {
                putExtra(Const.IntentParamsKey.OBJECT_ID, objectId)
            }
            context.startActivity(intent)
        }
    }

    override fun initViews() {
        setContentView(R.layout.activity_translucent)
        addFragment(SignDialogFragment.newInstance(objectId), R.id.root_layout, "SignDialogFragment")
    }

    override fun addRemarkInfo(content: String) {

    }

    override fun uploadAttachment(attachments: MutableList<Attachment>?) {
        mAttachments = attachments
    }
}

class SignDialogFragment : DialogFragment() {

    private val mObjectId: Int by lazy {
        arguments?.getInt(Const.IntentParamsKey.OBJECT_ID, 0) ?: 0
    }

    private var listener: AddRemarkListener? = null
    interface AddRemarkListener {
        fun addRemarkInfo(content: String)
    }

    //fragment与activity关联时进行调用(activity 传递到此方法)
    override fun onAttach(context: Context) {
        super.onAttach(context)
        listener = context as? AddRemarkListener
        if (listener == null) {
            throw  ClassCastException("$context must implement AddRemarkInfoListener")
        }
    }

    //调用是 创建fragment的视图层次结构
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_sign_dialog, container, false)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        activity?.addFragment(VerticalImageFragment.newInstance(ArrayList(), mObjectId, ImageFragment.UPLOAD_TYPE_RICHTEXT), R.id.ll_image, "VerticalImageFragment")
        cancle.setOnClickListener {
            activity?.finish()
        }
    }

    companion object {

        fun newInstance(objectId: Int): SignDialogFragment {
            val fragment = SignDialogFragment()
            val args = Bundle()
            args.putInt(Const.IntentParamsKey.OBJECT_ID,objectId)
            return fragment
        }
    }

}

TranslucentActivity 和 SignDialogFragment 和顶层文件就包含了接本每个Activty和Fragment会碰到的代码。

VerticalImageFragment代码就省略了

Kotlin LiveData 是用于 Android 开发的一个特性,它是一个发布-订阅模式的数据源。LiveData 允许你创建可以被观察(即订阅)的数据对象,从而让你的组件知道数据何时发生变化。这使得数据更新更加透明,并且可以轻松地将数据传递给依赖它的组件。 使用 Kotlin LiveData 的基本步骤如下: 1. 创建一个 LiveData 对象:LiveData 对象是你想要发布的数据的公共视图。你可以将任何可变的、可观察的数据(如变量、属性或对象)封装在 LiveData 对象中。 ```kotlin val liveData = MutableLiveData<Int>() ``` 2. 将数据设置为 LiveData 对象:你可以通过调用 LiveData 对象的 set 方法将数据发布出去。 ```kotlin liveData.value = 42 ``` 3. 将 LiveData 对象传递给依赖它的组件:你可以将 LiveData 对象传递给任何需要它的组件,如 ViewModel 或 Activity/Fragment。这样,当 LiveData 中的数据发生变化时,所有订阅该数据的组件都会收到通知。 4. 使用观察者更新 UI:一旦你订阅了 LiveData 对象,你就可以在 UI 中使用观察者来更新 UI。当数据发生变化时,UI 将自动更新。 LiveData 的优点包括: * 它提供了一种简单的方法来处理数据更新,使得组件之间的通信更加清晰和一致。 * 它允许你将数据传递给任何需要它的组件,而无需手动复制或传递数据。 * 它支持多线程操作,可以在异步操作中安全地更新 LiveData 对象。 需要注意的是,LiveData 是用于在后台线程中维护数据的,并且不能被外部观察者修改。因此,如果你需要修改数据并通知外部观察者,你可能需要使用其他方法,如使用 ViewModel 或其他观察者模式实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值