gpt4 book ai didi

java - Android - onTouchListener 不适用于子 LinearLayout

转载 作者:行者123 更新时间:2023-11-29 09:28:50 25 4
gpt4 key购买 nike

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

这是线性布局:

    <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 布局的组件树: enter image description here

在 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 接口(interface)时,我无法覆盖 onTouchEvent。 Android Studio 的智能感知找不到。当我手动编写它时,Android Studio 将 onTouchEvent 方法显示为错误。错误:方法未覆盖其父类(super class)中的方法。同样的答案是 here也是。

问题:如何为子 LinearLayout 调用 onTouch?

这是整个 fragment 布局的 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>

最佳答案

试试这个:

 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_forwardllContent之上,因此需要在onTouch()中返回false (btn_forward) .然后事件将从底部控件 (llContent) 调用。

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

关于java - Android - onTouchListener 不适用于子 LinearLayout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32426069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com