我有一个顶部栏布局,带有标题,垂直菜单和透明背景视图。
按下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>
顶部栏,菜单打开
答案 0 :(得分:12)
尝试在封面setClickable(false)
上使用View
。使用setOnClickListener()
方法会使View
可点击,这可能会“占用”您未来的事件(即使在使用null
之后也不会修改之前设置的可点击属性)。
作为一个方面,不是你的布局与你尝试做的相比非常复杂。更准确地说,布局比它应该更深。如果FrameLayout
容器具有与您的栏的RelativeLayout
相同的属性,则没有任何意义(您可以使用include
标记来包含该栏,而无需额外的FrameLayout
)。您还可以丢失top_bar_bg
View
并将侦听器直接设置在根RelativeLayout
上。
最后,内部RelativeLayout
(标题)可以通过在子Relativelayout
中正确定位子视图并在其下面留空白View
来删除并替换(使用适当的尺寸来模拟白色背景)。
答案 1 :(得分:1)
不是删除onClickListener
,而是可以做一件事。始终设置onClickListener
并使用boolean variable
来跟踪和关闭菜单。所以你的代码就像
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