删除视图上的OnClickListener会删除后面视图上的所有触摸事件

时间:2013-04-17 17:20:06

标签: android view 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>

顶部栏,菜单打开

enter image description here

2 个答案:

答案 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