如何禁用顶部透明层的触摸?

时间:2019-04-09 05:46:35

标签: android android-layout android-collapsingtoolbarlayout calendarview

我需要自定义具有将月份视图折叠为星期视图的日历。我为此使用了MaterialCalendarView库。为此,我采用了一个框架,其中MaterialCalendarView作为底层,CollapsingToolbarLayout在顶层作为透明视图。现在的问题是,我无法使用我的calendarView,因为它是最底层,并且无法触摸CollapsingToolbarLayout

我尝试设置android:clickable="false"中的CoodinatorLayout及其所有子元素,还尝试使用:collapsingToolbarLayout.setEnabled(false);并将触摸侦听器设置为false,但是没有运气。

这是我的XML文件:

-----some code-----
---
--
-
<RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:animateLayoutChanges="true">

        <com.prolificinteractive.materialcalendarview.MaterialCalendarView
            android:id="@+id/calendarView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:clickable="true"
            android:focusable="true"
            android:focusableInTouchMode="true"
            app:mcv_allowClickDaysOutsideCurrentMonth="false"
            app:mcv_firstDayOfWeek="monday"
            app:mcv_tileHeight="36dp" />

        <android.support.design.widget.CoordinatorLayout
            android:id="@+id/coordinator_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@android:color/transparent"
            android:clickable="false"
            android:focusable="false"
            android:focusableInTouchMode="false"
            android:focusedByDefault="false"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">

            <android.support.design.widget.AppBarLayout
                android:id="@+id/app_bar_layout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@android:color/transparent"
                android:clickable="false"
                android:focusable="false"
                android:focusableInTouchMode="false"
                android:focusedByDefault="false">

                <android.support.design.widget.CollapsingToolbarLayout
                    android:id="@+id/collapsing_layout"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:clickable="false"
                    android:focusable="false"
                    android:focusableInTouchMode="false"
                    android:focusedByDefault="false"
                    app:layout_scrollFlags="scroll|exitUntilCollapsed">

                    <android.support.v7.widget.Toolbar
                        android:id="@+id/dummy_toolbar"
                        android:layout_width="match_parent"
                        android:layout_height="72dp"
                        android:background="@android:color/transparent"
                        android:clickable="false"
                        android:focusable="false"
                        android:focusableInTouchMode="false"
                        android:focusedByDefault="false"
                        android:visibility="invisible"
                        app:contentInsetStart="0dp"
                        app:layout_collapseMode="pin">

                        <View
                            android:id="@+id/dummy_toolbar_view"
                            android:layout_width="match_parent"
                            android:layout_height="match_parent"
                            android:background="@android:color/transparent"
                            android:clickable="false"
                            android:focusable="false"
                            android:focusableInTouchMode="false"
                            android:focusedByDefault="false" />

                    </android.support.v7.widget.Toolbar>

                    <View
                        android:id="@+id/transparent_view"
                        android:layout_width="match_parent"
                        android:layout_height="252dp"
                        android:background="@android:color/transparent"
                        android:clickable="false"
                        android:focusable="false"
                        android:focusableInTouchMode="false"
                        android:focusedByDefault="false" />

                </android.support.design.widget.CollapsingToolbarLayout>

            </android.support.design.widget.AppBarLayout>

            <android.support.v4.widget.NestedScrollView
                android:id="@+id/nested_scroll_view"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@color/bg_dark_gray"
                android:fillViewport="true"
                android:scrollbars="none"
                app:layout_behavior="@string/appbar_scrolling_view_behavior">

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:focusable="true"
                    android:focusableInTouchMode="true"
                    android:orientation="vertical">

                    <android.support.v7.widget.RecyclerView
                        android:id="@+id/recycler_occasions"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:focusable="false" />

                    <TextView
                        android:id="@+id/txt_login"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center"
                        android:layout_marginStart="@dimen/dp_50"
                        android:layout_marginTop="@dimen/dp_30"
                        android:layout_marginEnd="@dimen/dp_50"
                        android:layout_marginBottom="@dimen/dp_100"
                        android:background="@drawable/btn_gradient_bg"
                        android:fontFamily="@font/poppins_semibold"
                        android:gravity="center"
                        android:padding="@dimen/dp_16"
                        android:text="@string/next"
                        android:textAllCaps="true"
                        android:textColor="@color/white"
                        android:textSize="@dimen/btn_text_size" />
                </LinearLayout>

            </android.support.v4.widget.NestedScrollView>
        </android.support.design.widget.CoordinatorLayout>
    </RelativeLayout>

这就是我在java文件中所做的:

collapsingToolbarLayout.setEnabled(false);
dummyToolbarView.setEnabled(false);
appBarLayout.setEnabled(false);
coordinatorLayout.setEnabled(false);

collapsingToolbarLayout.setOnTouchListener((v, event) -> {
      calendarView.dispatchTouchEvent(event);
      return false;
});
appBarLayout.setOnTouchListener((v, event) -> {
      calendarView.dispatchTouchEvent(event);
      return false;
});
coordinatorLayout.setOnTouchListener((v, event) -> {
      calendarView.dispatchTouchEvent(event);
      return false;
});
transparentView.setOnTouchListener((v, event) -> {
      calendarView.dispatchTouchEvent(event);
      return false;
});
dummyToolbarView.setOnTouchListener((v, event) -> {
      calendarView.dispatchTouchEvent(event);
      return false;
});


collapsingToolbarLayout.setClickable(false);
coordinatorLayout.setClickable(false);
appBarLayout.setClickable(false);
transparentView.setClickable(false);

在禁用所有视图的触摸之后,仍然调用onClick,这就是为什么我也禁用了click。

通过这样做,我可以在折叠状态下处理MaterialCalendarView的触摸,但是在展开时MaterialCalendarView无法使用它,而其他视图则可以单击。

请帮助我。我想访问CoordinatorLayout内的NestedScrollView触摸并禁用对# This Function will return Button id def button_id(id): print("Button {} is pressed".format(id)) return id 以外的视图的触摸。

谢谢。

2 个答案:

答案 0 :(得分:1)

onInterceptTouchEvent在分派给子视图之前,先响应父布局触摸事件。

@Override
 public boolean onInterceptTouchEvent(MotionEvent ev) {
 // Decide if to intercept or not
 return true;
 }

Touch flow control in Android

答案 1 :(得分:0)

感谢大家的努力。

我通过重写dispatchTouchEvent解决了这个问题。感谢@Abyss的这篇文章-解决方案2对我有用:https://stackoverflow.com/a/21971924/6384924

@Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        return super.dispatchTouchEvent(ev);
    }

在每个视图的触摸上调度日历触摸

collapsingToolbarLayout.setOnTouchListener((v, event) -> {
            calendarView.dispatchTouchEvent(event);
            return false;
        });
        dummyToolbarView.setOnTouchListener((v, event) -> {
            calendarView.dispatchTouchEvent(event);
            return false;
        });
        appBarLayout.setOnTouchListener((v, event) -> {
            calendarView.dispatchTouchEvent(event);
            return false;
        });
        coordinatorLayout.setOnTouchListener((v, event) -> {
            calendarView.dispatchTouchEvent(event);
            return false;
        });
        transparentView.setOnTouchListener((v, event) -> {
            calendarView.dispatchTouchEvent(event);
            return false;
        });
        dummyToolbar.setOnTouchListener((v, event) -> {
            calendarView.dispatchTouchEvent(event);
            return false;
        });