有没有办法确保导航抽屉在片段内容之上?
我创建了一个带有虚拟数据的小型测试应用程序。由10个片段组成,每个片段都有相应的编号按钮和文本视图。问题是片段元素似乎比导航抽屉具有更高的优先级。
如屏幕截图所示,一旦我尝试打开“0片段”,它就会选择在导航抽屉后面的按钮上注册单击事件。按其他内容项可以正常工作,但前提是它们下面没有其他可交互的项。我该怎么做才能使导航抽屉正确地停留在其后面的内容之上?
有没有办法确保导航抽屉在片段内容之上?
我创建了一个带有虚拟数据的小型测试应用程序。由10个片段组成,每个片段都有相应的编号按钮和文本视图。问题是片段元素似乎比导航抽屉具有更高的优先级。
如屏幕截图所示,一旦我尝试打开“0片段”,它就会选择在导航抽屉后面的按钮上注册单击事件。按其他内容项可以正常工作,但前提是它们下面没有其他可交互的项。我该怎么做才能使导航抽屉正确地停留在其后面的内容之上?
在滑动面板布局上设置android:clickable="true"
标签。
主内容视图(上面的FrameLayout)必须是DrawerLayout中的第一个子元素,因为XML顺序意味着z-ordering,并且抽屉必须在内容之上。
mFragmentContainerView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
});
我用了另外一种方式解决了这个问题。
以下是我的代码来设置抽屉:
/**
* Setup Navigation Drawer
*/
private void setDrawer() {
NavigationDrawerFragment mNavigationDrawerFragment = (NavigationDrawerFragment) getFragmentManager().findFragmentById(R.id.fragment_drawer);
mNavigationDrawerFragment.setup(R.id.fragment_drawer, (DrawerLayout) findViewById(R.id.drawer), mToolbar);
}
setup
方法在我的NavigationDrawerFragment
中,以下是我的代码:
/**
* Users of this fragment must call this method to set up the navigation drawer interactions.
*
* @param fragmentId The android:id of this fragment in its activity's layout.
* @param drawerLayout The DrawerLayout containing this fragment's UI.
* @param toolbar The Toolbar of the activity.
*/
public void setup(int fragmentId, DrawerLayout drawerLayout, Toolbar toolbar) {
View mFragmentContainerView = (View) getActivity().findViewById(fragmentId).getParent();
DrawerLayout mDrawerLayout = drawerLayout;
//noinspection deprecation
mDrawerLayout.setStatusBarBackgroundColor(getResources().getColor(R.color.colorPrimaryDark));
ActionBarDrawerToggle mActionBarDrawerToggle = new ActionBarDrawerToggle(getActivity(), mDrawerLayout, toolbar, "Drawer opened", "Drawer closed") {
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
if (!isAdded()) return;
// Solution:
// Disable click event on views below Navigation Drawer
mFragmentContainerView.setClickable(false);
getActivity().invalidateOptionsMenu();
}
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
if (!isAdded()) return;
// Solution:
// Enable click event on views below Navigation Drawer
mFragmentContainerView.setClickable(true);
getActivity().invalidateOptionsMenu();
}
};
// Defer code dependent on restoration of previous instance state.
mDrawerLayout.post(new Runnable() {
@Override
public void run() {
mActionBarDrawerToggle.syncState();
}
});
//noinspection deprecation
mDrawerLayout.setDrawerListener(mActionBarDrawerToggle);
}
就是这样
您需要在抽屉布局的最高视图中设置clickable
,focusable
和focusableInTouchMode
。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
android:focusable="true"
android:focusableInTouchMode="true">
嗯,我找到了一个解决这个问题的方法。当抽屉被打开时,您可以通过在使用的布局上调用bringToFront()方法将导航栏置于前台。这确保了导航抽屉始终位于任何底层内容的顶部,直到选择了新项目。
I.e:
@Override
public void onDrawerOpened(View drawerView)
{
activity.getActionBar().setTitle("Select content");
activity.invalidateOptionsMenu();
drawerLayout.bringToFront();
}