如何在不重新加载导航组件体系结构的情况下导航到上一个片段
How to navigate to previous fragment without reloading in navigation component architecture
我有片段 A,它在打开时会加载一些数据。当我们点击时它有一个按钮。它导航到片段 B。这不是问题,问题是当我在片段 B 中按回按钮时它会返回片段 A 并在片段 A 中重新加载该数据。我的问题是我不想在片段 A 中重新加载该数据返回时按 From Fragment B.
提前致谢
您应该使用 viewModel 并将所有数据放在 viewModel 中,如果返回按片段将重新加载但您的数据不会刷新,它将与之前的视图相同。
Class TestViewModel:ViewModel(){
init{
apiReqest()
}
fun apiReqest(){
// writer here your api request code and observe it on view using observer
}
}
我会推荐 Dharmender 的方法,但如果您不使用视图模型,那么您可以试试这个:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val tv1 = requireActivity().findViewById<TextView>(R.id.tv1)
tv1.setOnClickListener {
if(!isUpdated) {
isUpdated = true
requireActivity().supportFragmentManager.beginTransaction()
.replace((requireView().parent as ViewGroup).id, F2.newInstance())
.addToBackStack("f2").commit()
}else{
Toast.makeText(requireActivity(),"Already updated!", Toast.LENGTH_LONG).show()
}
}
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
Log.e(TAG,"On create view")
return inflater.inflate(R.layout.fragment_f1, container, false)
}
companion object {
@JvmStatic
fun newInstance() =
F1()
val TAG = F1::class.java.simpleName
var isUpdated = false
}
这里我使用了一个 isUpdated 标志。
我有片段 A,它在打开时会加载一些数据。当我们点击时它有一个按钮。它导航到片段 B。这不是问题,问题是当我在片段 B 中按回按钮时它会返回片段 A 并在片段 A 中重新加载该数据。我的问题是我不想在片段 A 中重新加载该数据返回时按 From Fragment B.
提前致谢
您应该使用 viewModel 并将所有数据放在 viewModel 中,如果返回按片段将重新加载但您的数据不会刷新,它将与之前的视图相同。
Class TestViewModel:ViewModel(){
init{
apiReqest()
}
fun apiReqest(){
// writer here your api request code and observe it on view using observer
}
}
我会推荐 Dharmender 的方法,但如果您不使用视图模型,那么您可以试试这个:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val tv1 = requireActivity().findViewById<TextView>(R.id.tv1)
tv1.setOnClickListener {
if(!isUpdated) {
isUpdated = true
requireActivity().supportFragmentManager.beginTransaction()
.replace((requireView().parent as ViewGroup).id, F2.newInstance())
.addToBackStack("f2").commit()
}else{
Toast.makeText(requireActivity(),"Already updated!", Toast.LENGTH_LONG).show()
}
}
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
Log.e(TAG,"On create view")
return inflater.inflate(R.layout.fragment_f1, container, false)
}
companion object {
@JvmStatic
fun newInstance() =
F1()
val TAG = F1::class.java.simpleName
var isUpdated = false
}
这里我使用了一个 isUpdated 标志。