首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >片段导航错误Android 13

片段导航错误Android 13
EN

Stack Overflow用户
提问于 2022-09-29 22:42:49
回答 2查看 168关注 0票数 1

因此,基本上,我有一个应用程序,通过使用片段之间的NavController导航,在不同的片段之间移动。这适用于所有Android版本< 13。

代码语言:javascript
复制
findNavController().navigate(R.id.step02Fragment)

Step05FragmentAndroid 13上的问题是,当我从Step05Fragment迁移到Step06Fragment时,onPauseonResume方法开始永远执行,从而导致StackOverflow错误。

我不知道为什么这两个步骤和这个特定的Android版本之间会发生这种情况。所有其他片段也以完全相同的方式进行导航,并且这个问题不会发生在它们身上。

有什么想法吗?

谢谢

这些是库的版本,如果这是其中任何一个已知的问题

代码语言:javascript
复制
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"
implementation "androidx.lifecycle:lifecycle-service:2.5.1"

implementation "androidx.navigation:navigation-runtime-ktx:2.5.2"
implementation "androidx.navigation:navigation-fragment-ktx:2.5.2"
implementation "androidx.navigation:navigation-ui-ktx:2.5.2"
implementation "androidx.navigation:navigation-dynamic-features-fragment:2.5.2"

以下是片段的代码

代码语言:javascript
复制
@AndroidEntryPoint
class Step05Fragment : Fragment() {

    lateinit var binding: FragmentStep05Binding

    private var initialSetup: Boolean = true
    private val disposable = CompositeDisposable()

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        binding = FragmentStep05Binding.inflate(inflater, container, false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        arguments?.getBoolean(Constants.ENABLE_PERMISSION)?.let {
            initialSetup = it
        }

        setObservables()
        setView()
    }

    override fun onDestroy() {
        super.onDestroy()
        disposable.dispose()
    }

    private fun setObservables() {
        binding.btnEnable.clicks()
            .map {
                checkPermission()
            }
            .subscribe()
            .disposeBy(disposable)
    }

    private fun setView() {
        if (!initialSetup) {
            binding.currentStep.visibility = View.GONE
        }
    }

    private fun checkPermission() {
        if (!PermissionsUtils.isReadExternalStoragePermissionGranted(requireContext())) {
            requestPermission.launch(Manifest.permission.READ_EXTERNAL_STORAGE)
        } else {
            handleNavigation()
        }
    }

    private val requestPermission =
        registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
            if (isGranted) {
                handleNavigation()
            } else {
                checkPermission()
            }
        }

    private fun handleNavigation() {
        if (initialSetup) {
            findNavController().navigate(R.id.step06Fragment)
        } else {
            activity?.finishAffinity()
        }
    }

}

代码语言:javascript
复制
@AndroidEntryPoint
class Step06Fragment : Fragment() {

lateinit var binding: FragmentStep06Binding

private var initialSetup: Boolean = true
private val disposable = CompositeDisposable()

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View {
    binding = FragmentStep06Binding.inflate(inflater, container, false)
    return binding.root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    arguments?.getBoolean(Constants.ENABLE_PERMISSION)?.let {
        initialSetup = it
    }

    setObservables()
    setView()
}

override fun onDestroy() {
    super.onDestroy()
    disposable.dispose()
}

private fun setObservables() {
    binding.btnEnable.clicks()
        .map {
            checkPermission()
        }
        .subscribe()
        .disposeBy(disposable)
}

private fun setView() {
    if (!initialSetup) {
        binding.currentStep.visibility = View.GONE
    }
}

private fun checkPermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        if (!PermissionsUtils.isMediaLocationPermissionGranted(requireContext())) {
            requestPermission.launch(Manifest.permission.ACCESS_MEDIA_LOCATION)
        } else {
            handleNavigation()
        }
    } else {
        handleNavigation()
    }
}

private val requestPermission =
    registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
        if (isGranted) {
            handleNavigation()
        } else {
            checkPermission()
        }
    }

private fun handleNavigation() {
    if (initialSetup) {
        findNavController().navigate(R.id.step07Fragment)
    } else {
        activity?.finishAffinity()
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-10-03 17:38:08

过了一会儿,找到了答案

https://developer.android.com/about/versions/13/behavior-changes-13#granular-media-permissions

看起来这种奇怪的行为就是因为这个原因,在更新了我的项目依赖关系以使Android 13为目标之后,添加了下面的验证,并且它运行得很好。

代码语言:javascript
复制
private fun checkPermission() {
        if (!PermissionsUtils.isReadExternalStoragePermissionGranted(requireContext())) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
                requestPermission.launch(Manifest.permission.READ_MEDIA_IMAGES)
            } else {
                requestPermission.launch(Manifest.permission.READ_EXTERNAL_STORAGE)
            }
        } else {
            handleNavigation()
        }
    }
票数 0
EN

Stack Overflow用户

发布于 2022-10-03 19:41:16

这可以与绑定相关!我以前有过一些约束问题。您可以尝试将其更改为旧的findViewById或其他方式吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73902351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档