Android 导航抽屉 onDrawerSlide 未被调用
Android navigation drawer onDrawerSlide is not called
我已将以下代码放入 navigation drawer 的 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。试图在 onCreate、onResume 中调用 openDrawer,在调用 [=49= 中] - 仍然没有结果。
PPS。此外,我无法直接调用 onDrawerSlide - 因为我不知道 slideOffset 值。
我认为当您以编程方式打开抽屉以教用户使用它时,您需要使用 Handler
或 AsyncTask
调用 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
如果是之前,你应该调试。
我已将以下代码放入 navigation drawer 的 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。试图在 onCreate、onResume 中调用 openDrawer,在调用 [=49= 中] - 仍然没有结果。
PPS。此外,我无法直接调用 onDrawerSlide - 因为我不知道 slideOffset 值。
我认为当您以编程方式打开抽屉以教用户使用它时,您需要使用 Handler
或 AsyncTask
调用 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
如果是之前,你应该调试。