Android 在带有子对象的LinearLayout上未触发onClick
我有一个自定义的LinearLayout,有一个更小的TextView孩子。我希望能够单击TextView未覆盖的区域,因此我将clickable=true和onclicklistener设置为LinearLayout,但不会触发onClick。如果我在TextView上设置onclick侦听器,它将按预期工作 有人能帮忙吗 ar_item.xmlAndroid 在带有子对象的LinearLayout上未触发onClick,android,onclick,android-linearlayout,Android,Onclick,Android Linearlayout,我有一个自定义的LinearLayout,有一个更小的TextView孩子。我希望能够单击TextView未覆盖的区域,因此我将clickable=true和onclicklistener设置为LinearLayout,但不会触发onClick。如果我在TextView上设置onclick侦听器,它将按预期工作 有人能帮忙吗 ar_item.xml 您的文本视图高度覆盖整个父级(整个布局),因此您可以单击空白区域,但不能单击布局。尝试为您的TextView使用android:layout\u高度
您的文本视图高度覆盖整个父级(整个布局),因此您可以单击空白区域,但不能单击布局。尝试为您的TextView使用android:layout\u高度的包装内容。设置布局的单击侦听器。您没有使用自定义视图;您使用的是标准的线性布局。您的XML标记应该是:
<com.yourcode.ARView ...> ... </com.yourcode.ARView>
。。。
问题可能来自于在其布局中有android:layout\u height=“fill\u parent”
的文本视图。如果这不能解决问题,那么问题可能是onClick()事件。线性布局可能永远不会调用onClick(),因为它是一个布局。请尝试重写onTouch()事件侦听器。对于每个子级
android:duplicateParentState=“true”
需要确保的一点是,另一个视图不在您尝试单击的视图的顶部。这在框架布局中尤其常见(可能会涉及到您的子直线布局),或者在相对布局中,您可能忘记更新此行:
android:layout_below="@id/shouldBeTheIdOfTheViewCurrentlyBeingCovered"
因此,视图不会占用相同的空间。
android:duplicateParentState=“true”
对我没有帮助
要使布局可与其子项一起单击,您需要为每个子项添加此选项:
android:clickable="false"
然后单击处理将向上转到父级,但这不是您的情况,但我在单击查看组时遇到了类似的问题。在寻找解决方案一个小时后,我发现我在我的
ViewGroup
中将android:inputType
设置为TextView
,这阻止了onClick()
侦听器(不知道为什么)
不要在TextView中使用android:inputType
如果所讨论的视图是
TextView
s,则可能需要将其设置为focusable=“false”
,以便第一次单击不会聚焦于文本视图。将以下属性添加到线性布局中
子视图未处理的任何单击事件将自动传递给LinearLayout
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
...
android:focusable="true"
android:clickable="true">
<child/>
<child/>
</LinearLayout>
android:duplicateParentState=“true”使我的文本视图看起来像被禁用了,无法接收单击事件
您只需设置文本视图
clickable=“false”
。因此,单击事件将被分派到父布局,而文本视图仍然可以对触摸事件做出反应(产生连锁反应)。我遇到了同样的问题,所有的XML属性都不起作用。我不确定是否会发生这种情况,因为我以编程方式膨胀并添加视图,但这就是我解决问题的方法
我有一个扩展LinearLayout的类,它有一个TextView和一个ImageView。
在膨胀布局并获取视图之后,我为子视图指定了一个OnClickListener,当按下该按钮时,执行LineaLayout的onClickListner
public class MyView extends LinearLayout {
private OnClickListener clickListener;
ImageView imageView;
TextView textView;
@Override
public void setOnClickListener(@Nullable OnClickListener l) {
super.setOnClickListener(l);
clickListener = l;
}
void afterViews() {
imageView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
clickListener.onClick(MyView.this);
return false;
}
});
textView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
clickListener.onClick(MyView.this);
return false;
}
});
}
我也尝试过重写OnTouchListener,但是我的子视图没有产生我所需要的连锁反应。上述解决方案中没有一个适合我。然后我注意到在我的
LinearLayout
中有一个LinkMovementMethod
设置为TextView
。此类截取触摸事件、单击事件和TextView
的属性,例如可单击、可聚焦vs 让您的家长线性布局成为android:clickable=“true”
使所有儿童视图的android:clickable=“false”
在Linearlayout-Removeandroid:inputType=”“下,我遇到了同样的问题,所有的XML属性都不起作用。我认为这是因为我以编程方式膨胀并添加视图。对我来说,解决办法是——也是通过编程方式——将膨胀的根视图设置为不可单击:
View view = layoutInflater.inflate(R.layout.some_layout, someLinearLayout, false);
view.setClickable(false);
(是的,我试图让
某些布局在XML中不可单击。)文本视图的宽度比其父视图小,因此在线性布局的右侧应保留一个可单击区域。我遇到了完全相同的问题,您找到解决方案了吗?谢谢,解决了我的类似问题,即有多个控件要表示“单击”的视觉状态,而只需在父控件中处理事件。虽然我仍然看到一个非常奇怪的问题-当我有clickable=true,width/height=wrap/match时,它可以工作,但如果我将它们放入样式并使用该样式,它就不能工作(没有可视的“点击”状态,没有触发处理程序)。这是在2.3上;知道为什么会发生这种情况吗?谢谢!解决了我今天在嵌套线性布局选择中遇到的一个问题。Sill需要设置每个子android:clickable=“false”这并不总是起作用……请参考此……或应用于下面的child>android:clickable=“false”谢谢!我不明白为什么我的TextView会拦截点击。这也是我的问题,请确保您没有inputType或将其设置为none!感谢您发布此帖子。我没有任何效果,除非我找到您的答案,否则我的TextView有输入类型。谢谢@Yurets,这就像魔术一样。这一定是可以接受的WerThank。对我也有用!是的-有用。我的问题是我的孩子是按钮(天生可点击),所以我不得不将他们更改为ImageView。我不知道为什么我首先将他们作为按钮。如果布局中必须有可点击的孩子呢???然后你跳过设置android:clickable=“false”
用于那些孩子。@ekashking
public class MyView extends LinearLayout {
private OnClickListener clickListener;
ImageView imageView;
TextView textView;
@Override
public void setOnClickListener(@Nullable OnClickListener l) {
super.setOnClickListener(l);
clickListener = l;
}
void afterViews() {
imageView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
clickListener.onClick(MyView.this);
return false;
}
});
textView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
clickListener.onClick(MyView.this);
return false;
}
});
}
View view = layoutInflater.inflate(R.layout.some_layout, someLinearLayout, false);
view.setClickable(false);