项目场景:
通过Navigation导航来实现页面跳转,一个fragment在结束时出现一个弹窗,点击弹窗中的某个按键跳转到另一个fragment出错。
问题描述
java.lang.IllegalStateException: View androidx.appcompat.widget.AppCompatImageView{433e587 VFED..C.. ......ID 294,672-609,869 #7f080148 app:id/goToRest} does not have a NavController set
at androidx.navigation.Navigation.findNavController(Navigation.java:84)
at com.lzt.school.practiceLevel.PracticeLevel1$2.onClick(PracticeLevel1.java:179)
Dialog dialog = new Dialog(getActivity()); dialog.setContentView(ResId); dialog.show(); dialog.getWindow().setGravity(Gravity.DISPLAY_CLIP_HORIZONTAL); dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent); ImageView goToRest= dialog.findViewById(R.id.goToRest); //跳转错误一: goToRest.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { NavController navController= Navigation.findNavController(getView()); navController.navigate(R.id.action_practiceLevel1_to_charpterOneStudy); } }); //跳转错误二: goToRest.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); NavController navController= Navigation.findNavController(v); navController.navigate(R.id.action_practiceLevel1_to_charpterOneStudy); } });
原因分析:
第一个点击按键跳转错误为 View androidx.appcompat.widget.AppCompatImageView does not have a NavController set,这已经说了,就是你所点击的按键所在的fragment找不到NavController,找不到原因很简单,就是我的dialog视图覆盖掉了下面的fragment里的View,所以即使你getView还是会出错。
例如:Handler
发送消息有两种方式,分别是 Handler.obtainMessage()
和 Handler.sendMessage()
,其中 obtainMessage
方式当数据量过大时,由于 MessageQuene
大小也有限,所以当 message
处理不及时时,会造成先传的数据被覆盖,进而导致数据丢失。
解决方案:
提示:这里填写该问题的具体解决方案:
先 调用 dialog.dismiss()结束dialog弹窗,然后再 NavController navController= Navigation.findNavController(getView())获取导航控制器。
goToRest.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); NavController navController= Navigation.findNavController(getView()); navController.navigate(R.id.action_practiceLevel1_to_charpterOneStudy); } });