Подтвердить что ты не робот

Ящик навигации - отключите клик по элементам за выдвижным ящиком

Есть ли способ убедиться, что ящик навигации остается поверх содержимого фрагмента?

Я создал небольшое тестовое приложение с фиктивными данными. 10 фрагментов с соответствующей нумерованной кнопкой и текстовым просмотром. Проблема заключается в том, что элементы фрагмента, похоже, имеют более высокий приоритет, чем ящик навигации.

enter image description here

Как видно на скриншоте, как только я попытаюсь открыть "0-фрагмент", он вместо этого зарегистрирует щелчок на кнопке, расположенной за ящиком навигации. Нажатие любого другого элемента содержимого отлично работает, но это пока не будет никаких других взаимодействующих элементов под ними. Что я могу сделать, чтобы ящик навигации правильно оставался поверх содержимого позади него?

4b9b3361

Ответ 1

Установите тег android:clickable="true" на макет раздвижной панели.

Ответ 2

Проблема возникает не из-за фокусировки кликов,

Посетите https://developer.android.com/training/implementing-navigation/nav-drawer.html#DrawerLayout

Основной вид содержимого (FrameLayout выше) должен быть первым дочерним элементом в DrawerLayout, потому что порядок XML подразумевает z-порядок, а ящик должен находиться поверх содержимого.

Ответ 3

В моем ящике фрагментов я установил TouchListener для возврата True. Это сработало для меня

        mFragmentContainerView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            return true;
        }
    });

Ответ 4

Я решил это по-другому.

Вот мой код для настройки ящика:

/**
 * 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 layout.
 * @param drawerLayout The DrawerLayout containing this fragment 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);
}

Что он

Ответ 5

Хорошо, я нашел одно решение для этой проблемы. Когда ящик открывается, вы можете перенести навигационную панель на передний план, вызвав метод bringToFront() на используемом макете. Это гарантирует, что навигационный ящик остается поверх любого основного содержимого до тех пор, пока не будет выбран новый элемент.

то есть:

@Override
public void onDrawerOpened(View drawerView)
   {
   activity.getActionBar().setTitle("Select content");
   activity.invalidateOptionsMenu();
   drawerLayout.bringToFront();
   }