Как отключить касание верхнего прозрачного слоя?

Мне нужно настроить Календарь с функцией Сворачивания представления месяца в представление недели. Для этого я использую MaterialCalendarView Библиотеку. Для этого я взял кадр с MaterialCalendarView в качестве нижнего слоя и CollapsingToolbarLayout сверху в качестве прозрачного вида. Теперь проблема в том, что я не могу использовать свой календарь, так как это нижний слой, и отключить касание CollapsingToolbarLayout.

Я попытался установить android:clickable = "false" of 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, поэтому я также отключил щелчок.

Делая это, я могу обрабатывать касание MaterialCalendarView, когда оно находится в свернутом режиме, но когда оно развернуто, я не могу его использовать, какой-то другой вид принимает щелчок.

Пожалуйста, помогите мне с этим. Я хочу получить доступ к MaterialCalendarView touch и отключить сенсорные представления внутри CoordinatorLayout, кроме NestedScrollView.

Заранее спасибо.

Могу я спросить, почему за него проголосовали?

Naina 10.04.2019 07:19
1
1
681
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

onInterceptTouchEvent Реагирует на сенсорные события родительского макета, прежде чем они будут отправлены в дочерние представления.

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

Сенсорное управление потоком в Android

Метод onInterceptTouchEvent() доступен только для групп просмотра (поскольку именно они могут быть родителями/контейнерами с требованием перехватывать события касания), которые могут как бы следить за событием и перехватывать его, возвращая true. Если он возвращает false, то диспетчеризация продолжается как обычно.

Rakhi Dhavale 09.04.2019 08:49
Ответ принят как подходящий

Спасибо всем за усилия.

Я решил это, переопределив 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;
        });

Другие вопросы по теме