【问题标题】:Android - onTouchListener not working for child LinearLayoutAndroid - onTouchListener 不适用于子 LinearLayout
【发布时间】:2015-09-06 17:03:09
【问题描述】:

我正在尝试向上/向下滑动手势。问题不在于如何实现向上/向下滑动捕捉。我无法接听 onTouch 电话。 在 Fragment 布局内部,有一个 LinearLayout 已为其设置了 onTouchListener。但不知何故,它不起作用 - 无法获得 onTouch 呼叫。

这就是LinearLayout:

    <LinearLayout
        android:id="@+id/llContent"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <Button
            android:id="@+id/btn_back"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="@android:color/transparent" />

        <Button
            android:id="@+id/btn_forward"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="@android:color/transparent" />

    </LinearLayout>

片段布局的组件树如下:

在 Fragment 的 onCreateView 中,我将 onTouchListener 设置为该 LinearLayout:

    LinearLayout llContent = (LinearLayout) view.findViewById(R.id.llContent);
    llContent.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            new MyLog("Touch");
            return true;
        }

    });

我想,这是因为子按钮和 clickListeners。所以我禁用了它们:

//        view.findViewById(R.id.btn_back).setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View v) {
//                mCurrentIndex = (mCurrentIndex > 0) ? mCurrentIndex - 1 : 0;
//                update();
//            }
//        });
//        view.findViewById(R.id.btn_forward).setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View v) {
//                mCurrentIndex = (mCurrentIndex < mPagination.size() - 1) ? mCurrentIndex + 1 : mPagination.size() - 1;
//                update();
//            }
//        });

在 StackOverflow 上,有很多关于此的问题并且有解决方案。

尝试 1: 这个answer 说我应该从onTouch 方法返回true。我的 onTouch 方法已经返回 true。

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        new MyLog("Touch");
        return true;
    }

尝试 2: 这个答案说我应该重写 onTouchListener 的 onTouchEvent 方法。但是当我实现 onTouchListener 接口时,我无法覆盖 onTouchEvent。 Android Studio 的智能感知找不到。当我手动编写它时,Android Studio 将 onTouchEvent 方法显示为错误。 错误:方法没有覆盖其超类中的方法。同样的答案也是here

问题:如何获取子LinearLayout的onTouch调用?

这是整个片段布局的 XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FEFFFF">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <HorizontalScrollView
            android:layout_width="match_parent"
            android:layout_height="41dp"
            android:background="#EFF0F1"
            android:scrollbars="none">

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:gravity="center_vertical"
                android:orientation="horizontal"
                android:paddingLeft="57dp"
                android:paddingRight="57dp">

                <TextView
                    android:id="@+id/tvTitle"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textColor="#2E2F30"
                    android:textSize="17sp" />

                <TextView
                    android:id="@+id/tvAuthor"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="5dp"
                    android:textColor="#5E5F60"
                    android:textSize="17dp" />

            </LinearLayout>

        </HorizontalScrollView>

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical"
                android:paddingBottom="8dp"
                android:paddingLeft="25dp"
                android:paddingRight="25dp"
                android:paddingTop="8dp">

                <TextView
                    android:id="@+id/tv"
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    android:textColor="#1C1D1D"
                    android:textSize="18sp" />

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="24dp"
                    android:orientation="vertical">

                    <View
                        android:layout_width="match_parent"
                        android:layout_height="1dp"
                        android:background="#050505" />

                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="8dp"
                        android:orientation="horizontal">

                        <TextView
                            android:id="@+id/tvPercent"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_marginRight="10dp"
                            android:textSize="15sp" />

                        <TextView
                            android:id="@+id/tvProgress"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:textColor="#444546"
                            android:textSize="15sp" />

                    </LinearLayout>

                </LinearLayout>

            </LinearLayout>

            <LinearLayout
                android:id="@+id/llContent"
                android:layout_width="match_parent"
                android:layout_height="match_parent">

                <Button
                    android:id="@+id/btn_back"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:background="@android:color/transparent" />

                <Button
                    android:id="@+id/btn_forward"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="1"
                    android:background="@android:color/transparent" />

            </LinearLayout>


        </RelativeLayout>

    </LinearLayout>

</RelativeLayout>

【问题讨论】:

  • 你能解决这个问题吗?我有类似的问题,但在我的情况下,应用程序在通过按钮启动时没有检测到任何手势。
  • Try this answer希望这有帮助
  • Try this answer希望这有帮助!

标签: java android android-layout ontouchlistener


【解决方案1】:

试试这个:

 LinearLayout llContent = (LinearLayout) view.findViewById(R.id.llContent);
        llContent.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                Log.d(TAG, "onTouch");
                return true;
            }

        });

        Button ff = (Button)view.findViewById(R.id.btn_forward);
        ff.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                Log.i(TAG, "onTouch");
                return false;

            }
        });

        ff.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.i(TAG, "onClick");
            }
        });

btn_forward 高于llContent,因此您需要在onTouch() (btn_forward) 中返回 false。然后事件将从底部控件(llContent)中调用。

在您的按钮上设置android:clickable="false"android:focusable="false"

【讨论】:

  • 得到这个:09-06 13:37:20.752 21508-21508/net.joerichard.reader D/ReaderLog: bForward:onTouch 09-06 13:37:20.872 21508-21508/net.joerichard .reader D/ReaderLog﹕bForward:onTouch 09-06 13:37:20.872 21508-21508/net.joerichard.reader D/ReaderLog﹕bForward:onClick.
  • 仍然没有为 llContent 获取 onTouch
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-15
  • 1970-01-01
  • 1970-01-01
  • 2015-05-09
  • 1970-01-01
  • 2021-05-26
  • 2016-12-02
相关资源
最近更新 更多