1 回答
TA贡献1815条经验 获得超13个赞
尝试这个:
<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 会将触摸事件发送到触摸事件遇到的第一个视图。OnTouchListeners 返回一个布尔值,指示它们是否消耗了该事件。如果它们没有消耗该事件,则该事件将传播到触摸事件将遇到的层次结构中的下一个视图。
这就是为什么您的单击按钮最初从未被注册,因为布局正在消耗触摸事件并阻止其传播到按钮。
这是标准的 Android 行为,只有一个视图可以处理任何单个触摸事件。
决定采取其他措施表明您应该考虑应用程序的设计并决定这种行为是否绝对必要。
但是,如果您的情况是罕见的情况之一,我将提供触摸监听器的示例。
请注意,这个触摸监听器假设您正在使用我上面发布的 xml 以及附加到原始问题中的按钮的点击监听器。
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是用户抬起手指的事件操作。
添加回答
举报