Android 导航抽屉 onDrawerSlide 未被调用

Android navigation drawer onDrawerSlide is not called


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

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,在调用 [=49= 中] - 仍然没有结果。

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

我认为当您以编程方式打开抽屉以教用户使用它时,您需要使用 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);

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

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

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

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