【问题标题】:fragment switching - can't return from backstack片段切换 - 无法从后台堆栈返回
【发布时间】:2018-06-09 08:36:31
【问题描述】:

我正在尝试在两个片段之间实现导航。一个是我的应用程序的默认视图,它只包含带有自己项目的 RecyclerView,另一个是带有 TableLayout 作为子项的 ScrollView。应用程序从我的ViewAdverts 片段正确切换到AddAdvert,但是当我想返回时出现异常并且应用程序崩溃:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: pl.polsl.elektr.quicktrade011, PID: 14676
    java.lang.IllegalStateException: ScrollView can host only one direct child
    at android.widget.ScrollView.addView(ScrollView.java:248)
    at android.support.design.widget.BaseTransientBottomBar.showView(BaseTransientBottomBar.java:444)
    at android.support.design.widget.BaseTransientBottomBar$1.handleMessage(BaseTransientBottomBar.java:185)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5254)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

我不知道为什么该错误仅在从 ScrollView 返回到 RecyclerView 时出现,而不是在默认片段包含 RecyclerView 时在应用程序启动时出现。 这是我的 .java.xml 文件: 5 files at Gist

【问题讨论】:

    标签: android android-fragments scrollview android-xml android-scrollview


    【解决方案1】:

    片段 A

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = 
        fragmentManager.beginTransaction();
        fragment = new DashboardFragment();
        fragmentTransaction.replace(R.id.container, fragment).addToBackStack(null).commit();
    

    片段 B

        rootview.setFocusableInTouchMode(true);
        rootview.requestFocus();
        rootview.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
    
                if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) {
                    // DO WHAT YOU WANT ON BACK PRESSED
                    getFragmentManager().popBackStack();
                    return true;
                } else {
                    return false;
                }
            }
        });
    

    【讨论】:

    • 谢谢,它解决了我的问题。但我仍然很好奇为什么它抛出了与布局相关的东西(ScrollView - 即使在这个例子中它在哪里?),而不是片段的后台堆栈。我的意思是 - 你怎么知道,上面的解决方案会修复它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多