Навигационный ящик - отключить щелчок по элементам позади ящика
Есть ли способ убедиться, что навигационный ящик остается поверх содержимого фрагмента?
Я создал небольшое тестовое приложение с фиктивными данными. 10 фрагментов с соответствующей пронумерованной кнопкой и просмотром текста. Проблема в том, что элементы фрагмента имеют более высокий приоритет, чем навигационная панель.
Как видно на скриншоте, как только я пытаюсь открыть "0 фрагмент", вместо этого он решает зарегистрировать щелчок по кнопке за навигационным блоком. Нажатие любого другого элемента контента работает нормально, но это до тех пор, пока под ними нет других интерактивных элементов. Что я могу сделать, чтобы навигационный ящик правильно оставался поверх содержимого позади него?
5 ответов
Задавать android:clickable="true"
тег на макете скользящей панели.
Проблема, кажется, не из-за фокуса щелчка,
Посетите https://developer.android.com/training/implementing-navigation/nav-drawer.html
Основное представление содержимого (выше FrameLayout) должно быть первым дочерним элементом в DrawerLayout, поскольку порядок XML подразумевает z-упорядочение, а ящик должен быть поверх содержимого.
В своем блоке фрагментов я установил TouchListener для возврата True. У меня сработало
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">
Ну, я нашел одно решение для этой проблемы. Когда ящик открывается, вы можете переместить навигационную панель на передний план, вызвав метод takeToFront() в используемом макете. Это гарантирует, что панель навигации останется поверх любого основного содержимого до тех пор, пока не будет выбран новый элемент.
То есть:
@Override
public void onDrawerOpened(View drawerView)
{
activity.getActionBar().setTitle("Select content");
activity.invalidateOptionsMenu();
drawerLayout.bringToFront();
}