目录

使用场景

实现:

(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()

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐