lelelongwang/WanJetpack

Navigation 如何打开新的页面 并关闭本身

Closed this issue · 12 comments

例如:登录页面 LoginFragment 登录成功以后,打开MainFragment 并且关闭 LoginFragment

  1. 本 demo 用的是 Navigation 进行的导航,界面之间相互跳转需要掌握:返回堆栈之间的跳转,包含以下常用方法:

    //代码中可以选择下面的方法:
    findNavController().navigate(int resId)
    NavController.navigateUp()
    NavController.popBackStack()
    
    //布局中可以选择下面的属性:
    <action
        .....
        app:popUpTo="@+id/a"
        app:popUpToInclusive="true"/>
  2. 例如:登录页面 LoginFragment 登录成功以后,打开MainFragment 并且关闭 LoginFragment

    可以在具体点说下什么场景吗?你说的场景用上面的方法,应该都可以实现

场景的话,比如一个需要先登录后使用的App, AFragment 启动 BFragment 必须还要关闭AFragment,这是堆栈就生一个BFragment的。
另外还有一个问题:一个Fragment启动自己本身 为啥没反应,启动失败

<fragment
      android:id="@+id/testFragment"
      android:name="com.test.testFragment"
      android:label="TestFragment"
      tools:layout="@layout/fragment_test"
      >
    <action
        android:id="@+id/action_testFragment_self"
        app:destination="@id/testFragment"
        app:enterAnim="@anim/slide_in_right"
        app:exitAnim="@anim/slide_out_left"
        app:popEnterAnim="@anim/slide_in_left"
        app:popExitAnim="@anim/slide_out_right" />
  </fragment>

navigation如果当前fragment是最后一个fragment,那么就不支持结束这个fragment

findNavController().navigate(
R.id.action_splashFragment_to_mainFragment,
bundleOf(MainFragment.usernameKey to "Alex Gladkov"),
navOptions {
popUpTo(R.id.nav_graph_application) {
inclusive = true
}
}
可以实现

另外还有一个问题:一个Fragment启动自己本身 为啥没反应,启动失败 。这个事情。作者有遇到过吗?

另外还有一个问题:一个Fragment启动自己本身 为啥没反应,启动失败 。这个事情。作者有遇到过吗?

这种场景没有试过,为什么会有这个场景呢?是想刷新当前 Fragment 吗?如果想刷新当前 Fragment的话,本 demo中遇到过:比如在 UserFragment 中退出登录后,要刷新界面,需要在 onCreateView()中新增 binding.lifecycleOwner = this 方法,代码如下:

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        binding = FragmentUserBinding.inflate(inflater, container, false)
        //设置lifecycleOwner后屏幕才刷新,eg:退出登录时
        binding.lifecycleOwner = this
        binding.userModel = viewModel

        subscribeUi()
        return binding.root
    }

这场景很常见啊!比如列表ListFragment 里面的item点击,下一个页面还是ListFragment

这种情况只需要刷新数据就行了吧,还需要在启动自己吗?

1.点击的时候,需要一个启动动画。2.点击返回,需要退出动画并回到上一个ListFragment页面

已解决

已解决