【问题标题】:Android navigation drawer onDrawerSlide is not called未调用 Android 导航抽屉 onDrawerSlide
【发布时间】:2015-04-21 18:51:15
【问题描述】:


我已将以下代码放入 导航抽屉onDrawerSlide 方法中,以便在抽屉打开时移动内容。

public void onDrawerSlide(View drawerView, float slideOffset) {
            super.onDrawerSlide(drawerView, slideOffset);
            container.setTranslationX(slideOffset * drawerView.getWidth());
            mDrawerLayout.bringChildToFront(drawerView);
            mDrawerLayout.requestLayout();
        }

除了第一次运行应用程序外,它几乎总是完美运行 - 我以编程方式打开抽屉来教用户使用它。 所以,当我打电话时

if (!mUserLearnedDrawer && !mFromSavedInstanceState) {
        mDrawerLayout.openDrawer(mFragmentContainerView);
   }

抽屉正在打开,但未调用 onDrawerSlide
我想,原因是某些东西没有足够的时间来加载,但我不知道究竟是什么以及如何逃避它。
当我在运行后几秒钟内调用 openDrawer 时(通过 Handler),它可以工作,但它在 UI 上看起来很糟糕。

PS。尝试在 onCreateonResume 中调用 openDrawer,在调用 Activity 时 - 仍然没有结果。

PPS。我也无法直接调用 onDrawerSlide - 因为我不知道 slideOffset 值。

【问题讨论】:

    标签: android navigation-drawer


    【解决方案1】:

    我认为,当您以编程方式打开抽屉以教用户使用它时,您需要使用 HandlerAsyncTask 调用 DrawerLayout.DrawerListener.onDrawerSlide(View drawerView, float slideOffset),这将及时更改 slideOffset 的值,即 [0, 1] .
    就像:

        private Handler mUIHandler = new Handler() {
    
        public void handleMessage(android.os.Message msg) {
            switch (msg.what) {
            case UPDATE_SLIDING_INDEX:
                double slideOffSet= (double)msg.obj;
                if (slideOffSet> 0.0 && slideOffSet<= 1.0) {
                    drawerListener.onDrawerSlide(drawer, slideOffSet);
                    Message message = mUIHandler.obtainMessage();
                    message.what = UPDATE_SLIDING_INDEX;
                    message.obj = slideOffSet- 0.1;
                    mUIHandler.sendMessageDelayed(message, 100);
                } else {
                    //To do something here.
                }
                break;
    
            default:
                break;
            }
        }
    };
    

    然后你这样调用:

    Message message = mUIHandler.obtainMessage();
    message.what = UPDATE_SLIDING_INDEX;
    message.obj = 0.8;
    mUIHandler.sendMessage(message);
    

    【讨论】:

    • 还不错,其实不用Handler也可以调用。但是我怎么知道 slideOffSet 的值(你把它设为 0.8)?
    • 哎呀,似乎我很愚蠢地创建这个主题并提出这个问题:-) 我可以将 1 作为 slideOffSet 传递,它会自动将内容移动到整个抽屉宽度。需要检查一下。
    • 好的,过一段时间调用 openDrawer 就可以了。虽然我使用了 Handler.postDelayed (代码比上面的答案短一些),但想法是一样的。所以我会接受这个答案,谢谢 SilentKnight。
    【解决方案2】:

    mDrawerLayout.setDrawerListener(....);在以下if条件之前或之后被调用时。

    if (!mUserLearnedDrawer && !mFromSavedInstanceState) {
            mDrawerLayout.openDrawer(mFragmentContainerView);
    }
    

    如果是after,显然onDrawerSlide不会被调用。

    如果是之前,那么你应该调试。

    【讨论】:

    • 当然,我在这个检查之前设置了监听器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多