关于android使用kotlin语言实现activity加载fragment时多个fragment的跳转的一种解决方案总结
具体步骤和上面一样,只不过要把activity中的代码写到父fragment中,并且要把changePage()方法中第三行代码。其中home_center_fragment就是将要加载fragment的容器,记住后面会用到。这个枚举中主要存放将要加载的fragment类的类名及其含义。
·
目录
(4)将要加载的fragment代码实例,布局文件自己创建就行这里不在说明
(5)让activity实现IMainActivity接口,并且创建所有将要加载的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()
更多推荐
已为社区贡献2条内容
所有评论(0)