kotlin——弹出显示fragment的两种方式、(navigation)NavController多个fragment控制(跳转)、fragment跳转带参数(传值)、viewmodel方式传值

一、NavController多个fragment控制(跳转)

代码结构:
在这里插入图片描述

在这里插入图片描述
nav_main.xml关键代码:

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/nav_main"
    app:startDestination="@id/mainFragment">
<!--这里控制默认显示哪个页面 app:startDestination="@id/loginFragment"-->

    <fragment
        android:id="@+id/mainFragment"
        android:name="com.oneway.demo.navcontroller.fragment.MainFragment"
        android:label="MainFragment"
        tools:layout="@layout/fragment_main">
        <action
            android:id="@+id/action_mainFragment_to_loginFragment"
            app:destination="@id/loginFragment" />
    </fragment>


    <fragment
        android:id="@+id/loginFragment"
        android:name="com.oneway.demo.navcontroller.fragment.LoginFragment"
        android:label="fragment_login"
        tools:layout="@layout/fragment_login" />
    
</navigation>

MainActivity代码:

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

跳转到下一页使用:

Navigation.findNavController(mBinding.root)
 .navigate(R.id.action_mainFragment_to_loginFragment)

返回到上一页使用:

Navigation.findNavController(binding.root).popBackStack()

代码可在此下载:代码下载

二、NavController中fragment跳转带参数

1、NavController中fragment跳转带参数

跳转:
在这里插入图片描述
接收
在这里插入图片描述

2、使用viewmodel的方式进行传值

A、新建一个 ShareViewModel

class ShareViewModel : BaseViewModel() {
    var data = 0
}

B、在AFragment中进行赋值

private lateinit var shareViewModel: ShareViewModel
shareViewModel = ViewModelProvider(activity!!)[ShareViewModel::class.java]
shareViewModel.data=123

C、在BFragment中取值

private lateinit var shareViewModel: ShareViewModel
shareViewModel = ViewModelProvider(activity!!)[ShareViewModel::class.java]
Log.e(TAG, "获取到的值为:"+shareViewModel.data)

三、弹出显示fragment的两种方式

这里总结了显示fragment的两种方式,一种需要依靠fragment的id,另一种不需要fragment的id,但是需要继承DialogFragment。

1、依靠xml中有fragment的id显示

var transaction: FragmentTransaction? = null
var currentFragment: Fragment? = null
	/**
     * 隐藏当前的Fragment,显示传入的Fragment
     */
    fun showFragment(fg: Fragment) {
        transaction = fm.beginTransaction()
        if (!fg.isAdded()) {//如果之前没有添加过
            if (currentFragment != null) {//第一次进入是为空,就不用隐藏currentFragment
                Log.d(TAG, "" + fg.tag)
                transaction!!.hide(currentFragment!!).add(R.id.mainFrame, fg, fg.tag) //第三个参数为当前的fragment绑定一个tag,tag为当前绑定fragment的类名
            } else {
                transaction!!.add(R.id.mainFrame, fg, fg.tag)
            }
        } else {
            transaction!!.hide(currentFragment!!).show(fg)
        }
        currentFragment = fg
        transaction!!.commit()
    }

注意:fragment里面的布局需要使用FragmentLayout,不然替换显示会出现有残留
如果需要按返回键就隐藏显示的fragment,只需要在transaction!!.commit()这行前面加上:transaction!!.addToBackStack(null)

2、不需要xml中有fragment就可以显示

注意:显示的fragment需要继承DialogFragment

val fragmentManager: FragmentManager = activity!!.supportFragmentManager
val testFragment = TestFragment()
testFragment .show(fragmentManager, "LEDSettingFragment")
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

wy313622821

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

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

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

打赏作者

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

抵扣说明:

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

余额充值