java.lang.RuntimeException: Не можете создать экран для переданного screenKey в NavigationMenu? - PullRequest
0 голосов
/ 14 января 2019

HI, когда я нажимаю пункт «Отказ от ответственности» в меню навигации. получить следующее исключение.

java.lang.RuntimeException: не удается создать экран для пропущенного screenKey. на ru.terrakok.cicerone.android.SupportFragmentNavigator.unknownScreen (SupportFragmentNavigator.java:183) на ru.terrakok.cicerone.android.SupportFragmentNavigator.applyCommand (SupportFragmentNavigator.java:67) на ru.terrakok.cicerone.android.SupportAppNavigator.applyCommand (SupportAppNavigator.java:77) на ru.terrakok.cicerone.CommandBuffer.executeCommand (CommandBuffer.java:43) на ru.terrakok.cicerone.BaseRouter.executeCommand (BaseRouter.java:31) на ru.terrakok.cicerone.Router.navigateTo (Router.java:84) на com.empowered.healo.ui.activities.main.MainActivity $ initNavDrawer $ 3 $ onItemClicked $ 1.invoke (MainActivity.kt: 315) на com.empowered.healo.ui.activities.main.MainActivity $ initNavDrawer $ 3 $ onItemClicked $ 1.invoke (MainActivity.kt: 241) на com.empowered.healo.ui.activities.main.MainActivity $ initNavDrawer $ 2.onDrawerClosed (MainActivity.kt: 233) на android.support.v4.widget.DrawerLayout.dispatchOnDrawerClosed (DrawerLayout.java:859) на android.support.v4.widget.DrawerLayout.updateDrawerState (DrawerLayout.java:829) на android.support.v4.widget.DrawerLayout $ ViewDragCallback.onViewDragStateChanged (DrawerLayout.java:2174) на android.support.v4.widget.ViewDragHelper.setDragState (ViewDragHelper.java:891) на android.support.v4.widget.ViewDragHelper $ 2.run (ViewDragHelper.java:343) на android.os.Handler.handleCallback (Handler.java:836) на android.os.Handler.dispatchMessage (Handler.java:103)

ниже метод, который может вызвать проблемы

navList.setOnItemClickListener(object : ItemClickListener<MenuView.MenuItem> {
            override fun onItemClicked(t: MenuView.MenuItem, position: Int) {
                val fragment = supportFragmentManager.findFragmentById(R.id.fragmentContainer)
                var screen = ""
                @Suppress("Annotator") val currentScreen = fragment!!.arguments?.getString(ScreenNavigator.SCREEN_NAME)
                val data = Bundle()
                when (t.title) {
                    R.string.item_menu_home -> {
                        screen = Screen.HOME
                    }
                    R.string.item_menu_session -> {
                        screen = Screen.START_SESSION
                    }
                    R.string.chat_support -> {
                        navList.clearBadgeForMenuItem(R.string.support_feedback)
                        Notifications.cancelNotification(this@MainActivity, Notifications.PushData.Message.LOCAL_PUSH_ID)
                        screen = Screen.CHAT
                    }
                    R.string.item_menu_pain_profile -> {
                        screen = Screen.SELF_DIAGNOSIS
                    }
                    R.string.item_menu_schedule_reminders -> {
                        screen = Screen.SCHEDULE
                    }
                    R.string.item_menu_progress_prognosis -> {
                        screen = Screen.PROGRESS
                    }
                    R.string.activity_journal -> {
                        screen = Screen.ACTIVITY_JOURNAL
                    }
                    R.string.therapy_information -> {
                        screen = Screen.THERAPY_INFO
                    }
                    R.string.item_menu_therapy_settings -> {
                        screen = Screen.THERAPY_SETTINGS
                    }
                    R.string.item_menu_account -> {
                        data.putBoolean("profile", true)
                        screen = Screen.PROFILE
                    }
                    R.string.item_menu_favourite -> {
                        screen = Screen.FAVOURITE_EXERCISES //this menu
                    }
                    R.string.medical_disclaimer -> {
                        screen = Screen.MEDICAL_DISCLAIMER
                    }
                    R.string.terms_of_use -> {
                        screen = Screen.TERMS_OF_USE
                    }
                    R.string.privacy_policy -> {
                        screen = Screen.PRIVACY_POLICY
                    }
                    R.string.rate_share -> {
                        screen = Screen.RATE_AND_SHARE
                        val marketIntent = Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id={appId}"))
                        startActivity(marketIntent)
                    }
                    R.string.about_healo -> {
                        screen = Screen.ABOUT
                    }
                    R.string.sign_out -> {
                        toggleDrawerScreen(false)
                        presenter.logOut()
                        return
                    }
                    else -> toggleDrawerScreen(false)
                }
                toggleDrawerScreen(false)

                if (!screen.isEmpty() && screen != currentScreen) {
                    actionDrawerClose = if ((fragment is OnBackPressed) && (fragment.onBackPressed(screen, data))) {
                        null
                    } else {
                        {
                            HealApplication.INSTANCE.router.navigateTo(
                                    screen,
                                    data
                            )
                        }
                    }
                } else {
                    actionDrawerClose = null
                }
            }

и я проверил ниже метод навигации, передавая правую клавишу к фрагменту

@Override
        protected Fragment createFragment(String screenKey, Object data) {
            Map<String, Class<? extends Fragment>> fragments = getFragmentScreens(screenClass);
            if (!fragments.containsKey(screenKey)) {
                return null;
            }
            Fragment fragment = null;
            try {
                fragment = fragments.get(screenKey).newInstance();
                int direction = Gravity.BOTTOM;
                if (data != null) {
                    direction = ((Bundle) data).getInt(SCREEN_TRANSITION_DIRECTION, Gravity.BOTTOM);
                }
                if (data == null || !((Bundle) data).containsKey(SCREEN_TRANSITION)) {
                    Slide slide = new Slide(direction);
                    slide.setDuration(250);
                    slide.setInterpolator(new LinearInterpolator());
                    fragment.setEnterTransition(slide);
                }
                if (data != null) {
                    Bundle bundle = ((Bundle) data);
                    bundle.putString(SCREEN_NAME, screenKey);
                    fragment.setArguments(bundle);
                } else {
                    Bundle bundle = new Bundle();
                    bundle.putString(SCREEN_NAME, screenKey);
                    fragment.setArguments(bundle);
                }
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
            if (activity instanceof MainActivity) {
                ((MainActivity) activity).changeBackground();
            }
            return fragment;

        }

        @Override
        protected void setupFragmentTransactionAnimation(Command command, Fragment currentFragment, Fragment nextFragment, FragmentTransaction fragmentTransaction) {
            if (command instanceof Replace) {
                if (((Replace) command).getTransitionData() != null) {
                    Bundle bundle = (Bundle) ((Replace) command).getTransitionData();

                    if (bundle.containsKey(SCREEN_TRANSITION))
                        setupAnim((ScreenTransition) bundle.getSerializable(SCREEN_TRANSITION), fragmentTransaction);
                }
            } else if (command instanceof Forward) {
                if (((Forward) command).getTransitionData() != null) {
                    Bundle bundle = (Bundle) ((Forward) command).getTransitionData();

                    if (bundle.containsKey(SCREEN_TRANSITION))
                        setupAnim((ScreenTransition) bundle.getSerializable(SCREEN_TRANSITION), fragmentTransaction);
                }
            }
        }
    };
}

и ниже MedicalDisclaimerFragment

@SuppressLint("ValidFragment")
class MedicalDisclaimerFragment extends Fragment {
    public CustomToolbar customToolbar;
    private WebView webView;

    public static MedicalDisclaimerFragment newInstance() {
        Bundle bundle = new Bundle();
        bundle.putString("screenKey", "MEDICAL_DISCLAIMER"); // <-- это просто значение, чтобы проверить, работает ли так

        MedicalDisclaimerFragment fragment = new MedicalDisclaimerFragment();

        return fragment;
    }





    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.medical_disclaimer_fragment, container, false);
        customToolbar = rootView.findViewById(R.id.toolbars);
         getArguments().getString("screenKey","MEDICAL_DISCLAIMER");
        customToolbar.setOnClickListener((View v) -> {
            // do something
            getActivity().onBackPressed();
            // is this the error?
        });





        webView = rootView.findViewById(R.id.webViewMedical);
        webView.loadUrl(getString(R.string.assets_clinical_info));
        return rootView;
    }
}

Я следовал и другим методам, но приложение по-прежнему зависало

...