java 我在一个按钮上使用了LinearLayout,有什么方法可以处理下面的按钮点击事件吗?

q9yhzks0  于 2023-02-28  发布在  Java
关注(0)|答案(3)|浏览(142)

我有一个android活动xml和他xml里面做主要的相对布局。2相对布局里面添加一个按钮和一个线性布局,我有点击按钮,但没有点击,因为该按钮覆盖线性布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <Button
        android:id="@+id/btnTest"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <LinearLayout
        android:id="@+id/parentLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

    </LinearLayout>

</RelativeLayout>
getActivity().findViewById(R.id.btnTest).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.e(TAG, "onClick: ");
            }
        });

单击可打印日志。

t0ybt7op

t0ybt7op1#

试试这个:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <LinearLayout
        android:id="@+id/parentLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

    </LinearLayout>

    <Button
        android:id="@+id/btnTest"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</RelativeLayout>

android xml视图的创建方式类似于堆栈,其中xml文件中较低位置的视图呈现在文件中较早位置的视图之上。
听起来像是你的线性布局正在拦截触摸事件,阻止它们传播到它下面的按钮。
一种检查方法是在线性布局上设置背景,您会看到当它有一个彩色背景时,按钮不可见。

    • 更新日期:**

由于需要允许按钮和布局的触摸事件,因此我将扩展我的解决方案。
OnClickListeners是在android视图上接收点击事件的标准方法,但是下面有OnTouchListeners,它处理视图上的原始触摸而不是点击事件。
当以任何方式触摸android屏幕时,事件都会被记录下来,android会向触摸事件遇到的第一个视图发送一个打开触摸事件。OnTouchListener返回一个布尔值,指示它们是否使用了该事件。如果它们没有使用该事件,则该事件会传播到触摸事件遇到的层次结构中的下一个视图。
这就是为什么您的按钮的on click最初从未被注册,因为布局正在消耗触摸事件并阻止它传播到按钮。
这是标准的android行为,只有一个视图将处理任何单一的触摸事件。
决定不这样做意味着您应该考虑应用程序的设计,并决定这种行为是否确实必要。
然而,如果你的情况是一个罕见的场合,我将提供一个例子触摸监听器。

  • 请注意,这个on touch监听器假设您使用的是我上面发布的xml以及附加到原始问题中的按钮的on click监听器。*
getActivity()
    .findViewById(R.id.parentLayout)
    .setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                Log.e(TAG, "onTouch: ");
                return false;
            }
        });

然而,当用户触摸布局时,这将触发,当他们释放时,这是两个单独的运动事件。
要仅在一种类型的运动事件上触发,您需要检查传递的事件。

getActivity()
        .findViewById(R.id.parentLayout)
        .setOnTouchListener(new OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    if (event.getAction() == MotionEvent.ACTION_UP) {
                       Log.e(TAG, "onTouch: ");
                    }
                    return false;
                }
            });

在这段代码中,只有当用户从视图中抬起手指时才会记录日志,因为ACTION_UP是用户抬起手指的事件操作。

qvsjd97n

qvsjd97n2#

相对布局与线性布局相同,它保留了添加到其中的元素的顺序。您首先添加了按钮,然后添加了线性布局,这就是为什么按钮位于线性布局下方,因此您无法单击它。将线性布局放置在按钮视图上方,您将看到按钮,并通过java编码完成其余部分

7lrncoxx

7lrncoxx3#

将这些线添加到线性布局中:

android:clickable="false"
android:focusableInTouchMode="false"
android:focusable="false"

相关问题