【问题标题】:Android Navigation component retain current Fragment on Activity rotationAndroid Navigation 组件在 Activity 旋转时保留当前 Fragment
【发布时间】:2019-07-23 11:50:37
【问题描述】:

我有一个带有导航组件的 Activity MVVM 应用程序。当我导航时,一切正常。当旋转发生时,我的应用程序崩溃了,所以我使用了

findNavController().navigate(PermissionsFragmentDirections.Action_permissionsFragment_to_splashFragment())

应用程序崩溃了。然后我改成

findNavController().navigate(R.id.splashFragment)

现在可以了。奇怪,但这只出现在onRequestPermissionsResult。在其他地方我使用它就像在第一个代码示例中一样。

我设法解决了这个问题,但现在当我旋转屏幕时,我又回到了 navigation_graph 的开头。

对于导航,我的activity_home.xml 中有androidx.navigation.fragment.NavHostFragment

所以我的问题是如何在Activity 轮换时保留当前的Fragment

添加的代码

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    Fabric.with(this, Crashlytics())

    binding = DataBindingUtil.setContentView(this, R.layout.activity_home)
    binding.viewModel = settingsViewModel
    binding.lifecycleOwner = this

    //small constraintlayout for showing state of app online/offline
    constraintLayoutStanje.setOnClickListener {
        settingsViewModel.progress()
        val id: String = getId(this)
        settingsViewModel.settings(id)
    }

    setObservers()

    //all time running task
    Handler().postDelayed({
        mHandlerTask.run()
    }, interval)

}

观察者

fun setObservers() {
    //status
    settingsViewModel.status.observe(this, Observer {
        when (it) {
            NacinDelaEnum.ONLINEINT -> this.constraintLayoutStanje.setBackgroundColor(
                ContextCompat.getColor(
                    this,
                    R.color.greenStat
                )
            )
            NacinDelaEnum.OFFLINE -> this.constraintLayoutStanje.setBackgroundColor(
                ContextCompat.getColor(
                    this,
                    R.color.redStat
                )
            )
            NacinDelaEnum.ONLINEEXT -> this.constraintLayoutStanje.setBackgroundColor(
                ContextCompat.getColor(
                    this,
                    R.color.yellowStat
                )
            )
        }
        settingsViewModel.doneProgress()
    })

    //Toast
    settingsViewModel.toastMessage.observe(this, Observer {
        if (it.isNotEmpty()) {
            toast(it)
            settingsViewModel.doneToast()
        }
    })


    //progressBar
    settingsViewModel.pb.observe(this, Observer {
        pb.visible(it)
    })

}

NavHostFragment in activity_home.xml

<fragment
    android:name="androidx.navigation.fragment.NavHostFragment"
    android:layout_width="match_parent"
    android:layout_height="0dp" app:navGraph="@navigation/nav_graph" app:defaultNavHost="true"
    android:id="@+id/mainFragment" app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintBottom_toTopOf="@+id/constraintLayoutStanje"
    app:layout_constraintHorizontal_bias="1.0" app:layout_constraintVertical_bias="1.0"/>

我的nav_graph.xml

提前谢谢你

【问题讨论】:

  • 导航组件在旋转时保留当前片段,因此问题一定出在您的代码上。在此处发布您的代码。
  • 添加了我教的所有内容都会导致问题。
  • 解决办法是什么?我有同样的问题。
  • @IgorGanapolsky 没有解决它,因为我们只使用肖像我不想花太多时间解决它。如果你找到解决方案也在这里发布。
  • @Michael Hathi 你确定吗?证据是什么? “导航组件在旋转时保留当前片段,因此问题一定出在您的代码上。”

标签: android kotlin android-jetpack android-architecture-navigation


【解决方案1】:

在您的清单文件中,

`<activity android:name=".MyActivity"
      android:configChanges="orientation|screenSize|screenLayout|keyboardHidden"
      android:label="@string/app_name">`

更多信息, https://developer.android.com/guide/topics/resources/runtime-changes

【讨论】:

  • 不推荐。使用这样的快捷方式会影响您的整体应用程序架构。如果你这样做,你也可以让应用程序卡在纵向,那么我想你也可以只做 iphone 应用程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-12
  • 2019-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多