一、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")