导航抽屉在关闭时抽动
Navigation Drawer twitches on close
我尝试在我的应用中实现导航抽屉(Material 设计)。我的 activity 包含带片段的 FrameLayout。当 Navigation Drawer FrameLayout 中的用户 select 项重新加载新片段时:
listViewDrawer.setOnItemClickListener( new AdapterView.OnItemClickListener() {
@Override
public void onItemClick( AdapterView<?> parent, View view, int position, long id) {
drawerLayout.closeDrawer( listViewDrawer); // <<<-------
toolbar.setTitle( getResources().getString( R.string.title));
fragmentMain = new FragmentMain();
android.app.FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace( R.id.frameLayoutMain, ApplicationTapaKiosk.getInstance().fragmentMain)
.commit();
}
}
当我点击项目时一切正常。 Navigation Drawer 关闭不顺利,但冻结(抽搐、抽搐),因为片段在后台重新加载。
如何顺利关闭Navigation Drawer?
抽屉关闭大约需要 200 毫秒。所以你可以这样做:
Handler mHandler = new Handler();
drawerLayout.closeDrawer( listViewDrawer);
mHandler.postDelayed(
new Runnable() {
@Override
public void run () {
loadFragment();
}
}
, NAVDRAWER_CLOSE_DELAY // 250...for delay
);
你要决定你是否更喜欢:
正在替换 FrameLayout
中的 Fragment
然后关闭 DrawerLayout
或
关闭 DrawerLayout
然后替换你的 Fragment
.
实施第一种方法:
只需在您的代码中进行这些更改:
listViewDrawer.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
toolbar.setTitle(getResources().getString(R.string.title));
fragmentMain = new FragmentMain();
android.app.FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.frameLayoutMain, ApplicationTapaKiosk.getInstance().fragmentMain)
.commit();
fragmentManager.executePendingTransactions(); // wait for the transaction to finish
drawerLayout.closeDrawer(listViewDrawer); // call closeDrawer(...) as a last thing
}
}
实施第二种方法:
在用户点击时设置某种标志:
listViewDrawer.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
mDrawerItemClicked = true;
drawerLayout.closeDrawer(listViewDrawer);
}
}
并在您的 DrawerLayout
上设置 DrawerLayout.DrawerListener
,如下所示:
drawerLayout.setDrawerListener(new DrawerLayout.DrawerListener() {
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
}
@Override
public void onDrawerOpened(View drawerView) {
}
@Override
public void onDrawerClosed(View drawerView) {
if (mDrawerItemClicked){
mDrawerItemClicked = false;
toolbar.setTitle(getResources().getString(R.string.title));
fragmentMain = new FragmentMain();
android.app.FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.frameLayoutMain, ApplicationTapaKiosk.getInstance().fragmentMain)
.commit();
}
}
@Override
public void onDrawerStateChanged(int newState) {
}
});
我尝试在我的应用中实现导航抽屉(Material 设计)。我的 activity 包含带片段的 FrameLayout。当 Navigation Drawer FrameLayout 中的用户 select 项重新加载新片段时:
listViewDrawer.setOnItemClickListener( new AdapterView.OnItemClickListener() {
@Override
public void onItemClick( AdapterView<?> parent, View view, int position, long id) {
drawerLayout.closeDrawer( listViewDrawer); // <<<-------
toolbar.setTitle( getResources().getString( R.string.title));
fragmentMain = new FragmentMain();
android.app.FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace( R.id.frameLayoutMain, ApplicationTapaKiosk.getInstance().fragmentMain)
.commit();
}
}
当我点击项目时一切正常。 Navigation Drawer 关闭不顺利,但冻结(抽搐、抽搐),因为片段在后台重新加载。
如何顺利关闭Navigation Drawer?
抽屉关闭大约需要 200 毫秒。所以你可以这样做:
Handler mHandler = new Handler();
drawerLayout.closeDrawer( listViewDrawer);
mHandler.postDelayed(
new Runnable() {
@Override
public void run () {
loadFragment();
}
}
, NAVDRAWER_CLOSE_DELAY // 250...for delay
);
你要决定你是否更喜欢:
正在替换 FrameLayout
中的 Fragment
然后关闭 DrawerLayout
或
关闭 DrawerLayout
然后替换你的 Fragment
.
实施第一种方法:
只需在您的代码中进行这些更改:
listViewDrawer.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
toolbar.setTitle(getResources().getString(R.string.title));
fragmentMain = new FragmentMain();
android.app.FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.frameLayoutMain, ApplicationTapaKiosk.getInstance().fragmentMain)
.commit();
fragmentManager.executePendingTransactions(); // wait for the transaction to finish
drawerLayout.closeDrawer(listViewDrawer); // call closeDrawer(...) as a last thing
}
}
实施第二种方法:
在用户点击时设置某种标志:
listViewDrawer.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
mDrawerItemClicked = true;
drawerLayout.closeDrawer(listViewDrawer);
}
}
并在您的 DrawerLayout
上设置 DrawerLayout.DrawerListener
,如下所示:
drawerLayout.setDrawerListener(new DrawerLayout.DrawerListener() {
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
}
@Override
public void onDrawerOpened(View drawerView) {
}
@Override
public void onDrawerClosed(View drawerView) {
if (mDrawerItemClicked){
mDrawerItemClicked = false;
toolbar.setTitle(getResources().getString(R.string.title));
fragmentMain = new FragmentMain();
android.app.FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.frameLayoutMain, ApplicationTapaKiosk.getInstance().fragmentMain)
.commit();
}
}
@Override
public void onDrawerStateChanged(int newState) {
}
});