之前一直使用FragmentManager进行Fragment管理,最近发现Android官方早就出了更好用的组件,那么我就在此记录一下,既能方便他人上手,也能巩固自己的记忆。
此处主要实现在Acitivty下加载Fragment以及Activity对Fragment进行传值,Fragment之间的切换以及传值。
因为时间有限,文章的内容没有细写,主要还是为了备忘,后期有时间可以考虑认真写一期,包括多种加载方式等等,还请看官见谅。
一、添加Gradle依赖在App目录下添加navigation依赖
dependencies {
implementation "androidx.navigation:navigation-fragment-ktx:2.4.2"
implementation "androidx.navigation:navigation-ui-ktx:2.4.2"
}
二、相应文件代码
1.FragmentIndexActivity下的代码
Kotlin代码:
class FragmentIndexActivity : AppCompatActivity(R.layout.activity_fragment_index) {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 传递的bundle
val testBundle = Bundle()
testBundle.putString("text", "传递值:点击跳转页面")
// 获取NavHostFragment实例
val navHost = supportFragmentManager.findFragmentById(
R.id.container_view
) as NavHostFragment
// 通过NavHostFragment获取NavController实例
val controller = navHost.navController
// 通过NavController获取NavGraph实例
val graph = controller.graph
// 新建一个NavFragment对应的传递参数Argument
val builder = NavArgumentBuilder()
builder.defaultValue = testBundle
val argument = builder.build()
// 将参数Argument添加到NavGraph中以便Fragment使用
graph.addArgument("arg", argument)
}
}
XML布局文件:
2. 两个Fragment的代码
1. FirstFragment下的代码
Kotlin代码:
class FirstFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_first, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// 获取此前在Activity中设置的NavGraph中的参数
val map = findNavController().graph.arguments
val argument = map["arg"]
val bundle = argument?.defaultValue as Bundle
// 获取Bundle中的值
val text = bundle.getString("text", "")
// 设置Button显示的文字
mBtnSecond.text = text
val secondBundle = Bundle()
secondBundle.putString("second", "传递到下一个Fragment的值")
// 跳转至第二个Fragment页面,并且传递参数
mBtnSecond.setOnClickListener {
findNavController().navigate(R.id.action_firstFragment_to_secondFragment, secondBundle)
}
}
}
XML布局代码:
2. SecondFragment下的代码
Kotlin代码:
class SecondFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_second, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// 此处Fragment依然可以获取在Activity下设置的NavGraph中的值
val map = findNavController().graph.arguments
val activityArgument = map["arg"]
val bundle = activityArgument?.defaultValue as Bundle
val text = bundle.getString("text", "")
println("这是从上层Activity中传递过来的值:${text}")
// 此处获取从FirstFragment中传递的值
val secondText = arguments?.getString("second", "")
mBtnFirst.text = secondText
mBtnFirst.setOnClickListener {
// 点击返回上一层Fragment
findNavController().navigate(R.id.action_secondFragment_pop)
}
}
}
XML布局代码:
三. 文件nav_graph.xml
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)