Удаление OnClickListener в представлении удаляет все события касания на представлениях позади

У меня есть макет верхней панели с заголовком, вертикальным меню и прозрачным фоном.

Когда btn_menu нажата, вертикальное меню открывается с помощью анимации. Когда меню открыто, я устанавливаю OnClickListener на прозрачном фоне, который закрывает меню при щелчке прозрачного фона. При закрытии меню я OnClickListener из фонового представления, используя:

 mTopBarBg.setOnClickListener(null); 

Проблема в том, что он, кажется, удаляет все сенсорные события за его взглядами (устанавливается в content_container основного макета). Например. ViewPager который больше не обнаруживает салфетки, или ListView который не прокручивается и больше не может быть нажат, пока они работали правильно.

Что не так?

В верхнем фрагменте

 private void toggleMenu(int duration){ if(mMenuIsOpen){ TranslateAnimation anim1 = new TranslateAnimation(0,0,0,-(mHeight-mMenuVerticalOffset)); anim1.setFillAfter(true); anim1.setDuration(duration); mVerticalMenu.setAnimation(anim1); AlphaAnimation anim2 = new AlphaAnimation(0.7f, 0.0f); anim2.setFillAfter(true); anim2.setDuration(duration); mTopBarBg.setAnimation(anim2); mTopBarBg.setOnClickListener(null); mMenuIsOpen = false; } else{ TranslateAnimation anim1 = new TranslateAnimation(0,0,-(mHeight-mMenuVerticalOffset),0); anim1.setFillAfter(true); anim1.setDuration(duration); mVerticalMenu.setAnimation(anim1); AlphaAnimation anim2 = new AlphaAnimation(0.0f, 0.7f); anim2.setFillAfter(true); anim2.setDuration(duration); mTopBarBg.setAnimation(anim2); mTopBarBg.setOnClickListener(mBgClickListener); mMenuIsOpen = true; } } 

Основной макет

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:src="@drawable/mainbg" android:scaleType="centerCrop"/> <FrameLayout android:id="@+id/content_container" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingTop="44dp" /> <FrameLayout android:id="@+id/top_bar_container" android:layout_width="match_parent" android:layout_height="match_parent" android:clipChildren="false" /> </RelativeLayout> 

Макет верхней панели

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#00000000" > <View android:id="@+id/top_bar_bg" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#000000" android:visibility="gone" /> <LinearLayout android:id="@+id/vertical_menu" android:layout_width="50dp" android:layout_height="match_parent" android:layout_marginTop="44dp" android:background="#ffffff" android:orientation="vertical" android:visibility="gone" > <!-- vertical menu layout --> </LinearLayout> <RelativeLayout android:id="@+id/header" android:layout_width="match_parent" android:layout_height="44dp" android:background="#ffffff" > <Button android:id="@+id/btn_menu" android:layout_width="50dp" android:layout_height="44dp" android:background="@drawable/menubtn" /> <LinearLayout android:layout_width="match_parent" android:layout_height="44dp" android:layout_toRightOf="@id/btn_menu" android:gravity="center" > <ImageView android:layout_width="130dp" android:layout_height="44dp" android:src="@drawable/logo" /> </LinearLayout> </RelativeLayout> </RelativeLayout> 

Верхняя панель с открытым меню

Введите описание изображения здесь

Попытайтесь также использовать setClickable(false) в вашем оверлейном View . Использование setOnClickListener() делает View clickable, и это, вероятно, «съедает» ваши будущие события (даже после использования null поскольку это не изменяет ранее установленное свойство clickable).

Как сторона не ваш макет очень сложный по отношению к тому, что вы пытаетесь сделать. Точнее макет глубже, чем должно быть. Нет смысла иметь контейнер FrameLayout когда он обладает теми же свойствами, что и RelativeLayout вашего бара (вы можете использовать тег include, чтобы включить панель без необходимости в дополнительном FrameLayout ). Вы также можете потерять представление top_bar_bg и установить прослушиватель непосредственно на корневой RelativeLayout . Наконец, внутренний RelativeLayout (заголовок) может быть удален и заменен путем правильного позиционирования дочерних представлений в корневом Relativelayout с белым пустым View под ними (с соответствующими размерами для имитации белого фона).

Вместо удаления onClickListener вы можете сделать одну вещь. Всегда устанавливайте onClickListener и используйте boolean variable для отслеживания меню onClickListener И выкл. Таким образом, ваш код будет чем-то вроде

  boolean is_menu_open = false; public void onClick(View v){ if(is_menu_open){ hidemenu; is_menu_open = false; } else do nothing } 

И всякий раз, когда вы показываете меню, установите для параметра is_menu_open значение true