因此,基本上,我有一个应用程序,通过使用片段之间的NavController导航,在不同的片段之间移动。这适用于所有Android版本< 13。
findNavController().navigate(R.id.step02Fragment)Step05Fragment的Android 13上的问题是,当我从Step05Fragment迁移到Step06Fragment时,onPause和onResume方法开始永远执行,从而导致StackOverflow错误。
我不知道为什么这两个步骤和这个特定的Android版本之间会发生这种情况。所有其他片段也以完全相同的方式进行导航,并且这个问题不会发生在它们身上。
有什么想法吗?
谢谢
这些是库的版本,如果这是其中任何一个已知的问题
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"以下是片段的代码
@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()
}
}}
@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()
}
}发布于 2022-10-03 17:38:08
过了一会儿,找到了答案
https://developer.android.com/about/versions/13/behavior-changes-13#granular-media-permissions
看起来这种奇怪的行为就是因为这个原因,在更新了我的项目依赖关系以使Android 13为目标之后,添加了下面的验证,并且它运行得很好。
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()
}
}发布于 2022-10-03 19:41:16
这可以与绑定相关!我以前有过一些约束问题。您可以尝试将其更改为旧的findViewById或其他方式吗?
https://stackoverflow.com/questions/73902351
复制相似问题