7

我有一个带有标题、垂直菜单和透明背景视图的顶部栏布局。

按下时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>

打开菜单的顶栏

在此处输入图像描述

4

2 回答 2

13

尝试setClickable(false)在您的叠加层上也使用View。使用该setOnClickListener()方法使View可点击,这可能会“吃掉”你未来的事件(即使在使用后null不会修改之前设置的可点击属性)。

作为一个方面,您的布局与您尝试做的事情相比非常复杂。更准确地说,布局比它应该的更深。FrameLayout当容器具有与 bar相同的属性时,拥有一个容器是没有意义的RelativeLayout(您可以使用include标签来包含 bar 而无需额外的FrameLayout)。您也可以top_bar_bg View直接在 root 上丢失并设置侦听器RelativeLayout。最后,内部RelativeLayout(标题)可以通过将子视图正确定位在根中并在其下Relativelayout为白色空View(具有适当的尺寸以模拟白色背景)来移除和替换。

于 2013-04-22T05:16:53.290 回答
1

onClickListener您可以做一件事,而不是删除。始终设置onClickListener并使用 aboolean 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_opentrue

于 2013-04-22T04:14:35.467 回答