关于android使用kotlin语言实现activity加载fragment时多个fragment的跳转的一种解决方案总结

目录

使用场景

实现:

(1)创建一个接口文件

(2)创建一个枚举

(3)将要加载fragment的activity布局示例

(4)将要加载的fragment代码实例,布局文件自己创建就行这里不在说明

(5)让activity实现IMainActivity接口,并且创建所有将要加载的fragment对象

(6)实现fragment的嵌套


在activity中加载fragment的详细方法建议看第一行代码第三版

使用场景:

会有多个fragment在activity或fragment的同一个framreLayout(fragment的加载容器)中逐个加载时(附fragment嵌套时的跳转方法及通过点击事件切换fragment)

实现:

(1)创建一个接口文件

interface IMainActivity {
/**
     * 改变页面
     * @param toPageEnum 目标页面类型
     */
    fun changePage(toPageEnum: PageEnum?)
}

(2)创建一个枚举

这个枚举中主要存放将要加载的fragment类的类名及其含义

enum class PageEnum(var code:String,var pageName:String) {
    HomeCenter("HomeCenter","首页"),
    MeetingSignIn("MeetingSignIn","会议签到页");//每多一个fragment就创建一个枚举项
    open fun getInstanceByCode(code:String?) :PageEnum?{
        for (item in values()) {
            if (item.code.contentEquals(code)) {
                return item
            }
        }        return HomeCenter
    }
}

(3)将要加载fragment的activity布局示例

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/home_bg"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    
    <FrameLayout
        android:id="@+id/home_center_fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentBottom="true"
        android:layout_marginLeft="40dp"
        android:layout_marginRight="40dp"
        android:layout_marginTop="60dp"
        android:layout_marginBottom="60dp">
    </FrameLayout>

</RelativeLayout>

其中home_center_fragment就是将要加载fragment的容器,记住后面会用到

(4)将要加载的fragment代码实例,布局文件自己创建就行这里不在说明

class HomeCenterFragment: Fragment() {  

    lateinit var iMainActivity: IMainActivity    //创建一个接口类型的变量
    
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?): View? {
        iMainActivity = activity as IMainActivity
        return inflater.inflate(R.layout.fragment_home_center, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        go_control_icon.setOnClickListener {
            iMainActivity.changePage(PageEnum.ControlCentre)    //调用方法
        }
    }
}
(5)让activity实现IMainActivity接口,并且创建所有将要加载的fragment对象
class HomeActivity : AppCompatActivity(), IMainActivity {
    //缓存一级功能页面
    private var fragmentMap = HashMap<String, BaseFragment>()

    //当前页面
    private var currentPageEnum = PageEnum.HomeCenter

    private var homeCenterFragment: HomeCenterFragment? = null

    private var meetingDetailFragment: MeetingDetailFragment? = null

    private var meetingSignInFragment: MeetingSignInFragment? = null

    //实现的接口方法
    override fun changePage(toPageEnum: PageEnum?) {
        val currentFragment: BaseFragment? = fragmentMap[currentPageEnum.code]
        var toFragment: BaseFragment? = fragmentMap[toPageEnum!!.code]
        val tran = supportFragmentManager.beginTransaction()
        if (currentFragment != null) {
            tran.hide(currentFragment)
        }
        if (toFragment == null) {
            if (toPageEnum === PageEnum.HomeCenter) {  //判断要加载的fragment
                homeCenterFragment = HomeCenterFragment()
                toFragment = homeCenterFragment
            }  else if (toPageEnum === PageEnum.MeetingSignIn) {
                meetingSignInFragment = MeetingSignInFragment()
                toFragment = meetingSignInFragment
            }   //如果还有fragment继续在这里加就行      
            if (toFragment != null) {
                //注意下面R.id.home_center_fragment是加载fragment的容器frameLayout的id
               tran.add(R.id.home_center_fragment,toFragment,toFragment::class.java.name)
               fragmentMap[toPageEnum.code] = toFragment
            }
        } else {
            tran.show(toFragment)
        }
        tran.commit()
        currentPageEnum = toPageEnum
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_home)
        
        changePage(PageEnum.HomeCenter)
    }
}

(6)实现fragment的嵌套

具体步骤和上面一样,只不过要把activity中的代码写到父fragment中,并且要把changePage()方法中第三行代码

val tran = supportFragmentManager.beginTransaction()

改为:

val tran = childFragmentManager.beginTransaction()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小趴菜8227

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值