如果快速按下按钮,导航到 DialogFragment 会产生 IllegalArgumentException 吗?
Navigating to DialogFragment produces IllegalArgumentException if button pressed quickly?
我的 Navigation
图有两个目的地,Fragment
和 DialogFragment
。 Fragment
包含一个 Button
,在按下时导航到 DialogFragment
。
一切都按预期工作,除了 如果我非常快速地单击按钮。这样做可以触发一个
IllegalArgumentException: navigation destination
com.example.app:id/show_dialog is unknown to this NavController
为了解决这个问题,我确保当前目的地是包含 show_dialog
操作的 Fragment
:
val navController = findNavController()
val currentDest = navController.currentDestination?.id
if (currentDest == R.id.test_fragment) {
navController.navigate(TestFragmentDirections.showDialog())
}
进行此更改似乎可以解决问题。不过,我想知道:
Why is it necessary to wrap the navigate
call with a conditional statement in this situation?
你的问题只是基于Android内部架构,也取决于硬件性能。只需将其包装在 try/catch
块中:
try{
findNavController().navigate(TestFragmentDirections.showDialog())
}catch(e: IllegalArgumentException){
e.printStackTrace
}
你可能会得到 因为如果你看到 showDialog() 方法,你会发现实现如下:
public void show(FragmentManager manager, String tag) {
mDismissed = false;
mShownByMe = true;
FragmentTransaction ft = manager.beginTransaction();
ft.add(this, tag);
ft.commit();
}
我建议使用以下实现编写您自己的 showDialog
方法:
fragmentManager.beginTransaction()
.add(dialog, "TAG")
.commitAllowingStateLoss();
我的 Navigation
图有两个目的地,Fragment
和 DialogFragment
。 Fragment
包含一个 Button
,在按下时导航到 DialogFragment
。
一切都按预期工作,除了 如果我非常快速地单击按钮。这样做可以触发一个
IllegalArgumentException: navigation destination com.example.app:id/show_dialog is unknown to this NavController
为了解决这个问题,我确保当前目的地是包含 show_dialog
操作的 Fragment
:
val navController = findNavController()
val currentDest = navController.currentDestination?.id
if (currentDest == R.id.test_fragment) {
navController.navigate(TestFragmentDirections.showDialog())
}
进行此更改似乎可以解决问题。不过,我想知道:
Why is it necessary to wrap the
navigate
call with a conditional statement in this situation?
你的问题只是基于Android内部架构,也取决于硬件性能。只需将其包装在 try/catch
块中:
try{
findNavController().navigate(TestFragmentDirections.showDialog())
}catch(e: IllegalArgumentException){
e.printStackTrace
}
你可能会得到
public void show(FragmentManager manager, String tag) {
mDismissed = false;
mShownByMe = true;
FragmentTransaction ft = manager.beginTransaction();
ft.add(this, tag);
ft.commit();
}
我建议使用以下实现编写您自己的 showDialog
方法:
fragmentManager.beginTransaction()
.add(dialog, "TAG")
.commitAllowingStateLoss();