带有子项的onLineClick不在LinearLayout上触发
我有一个自定义的LinearLayout与一个较小的TextView子。 我希望能够点击没有被TextView覆盖的区域,所以我设置clickable = true和一个onclicklistener到LinearLayout,但onClick不会被触发。 如果我在TextView上设置onclick监听器,它按预期方式工作…
任何人都可以帮忙?
ar_item.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/ar_item" android:layout_width="202dp" android:layout_height="62dp" android:background="@drawable/bg_item_ar" android:clickable="true"> <TextView android:id="@+id/ar_item_txt" android:layout_width="164dp" android:layout_height="fill_parent" android:paddingBottom="8dp" android:paddingLeft="8dp" android:paddingTop="8dp" android:paddingRight="6dp" android:gravity="center" android:background="#50000000" /> </LinearLayout>
我的自定义LinearLayout
public class ARView extends LinearLayout { public ARView(final Context context, String name, String id) { super(context); getLayoutInflater().inflate(R.layout.ar_item, this ,true); LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.ar_item, null); TextView textView = (TextView) findViewById(R.id.ar_item_txt); textView.setText(name); setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Toast t = Toast.makeText(context, "hey!", Toast.LENGTH_SHORT); t.show(); } }); } }
为每个孩子
机器人:duplicateParentState = “真”
android:duplicateParentState="true"
没有帮助我。
为了使您的布局可以用它的孩子点击,您需要为每个孩子添加这个选项:
android:clickable="false"
然后点击处理将上升到父 。
这不是你的情况,但我有可点击的ViewGroup
类似的问题。 经过一个小时寻找解决scheme,发现我设置android:inputType
到我的ViewGroup
里面的阻止onClick()
监听器(不知道为什么)
不要在TextView中使用
android:inputType
您没有使用您的自定义视图; 你正在使用一个标准的LinearLayout。 你的XML标签应该是:
<com.yourcode.ARView ...> ... </com.yourcode.ARView>
android:duplicateParentState="true"
使得我的TextView看起来像被禁用,并且不能接收点击事件。
所有你需要的是设置TextView clickable="false"
。 所以点击事件会派发到父级布局, TextView仍然可以对触摸事件做出反应(带有连锁反应)。
您的TextView高度覆盖了整个父级(整个布局),因此您可以单击空白区域而不是布局。 尝试使用您的TextView的android:layout_height的wrap_content。 设置布局的点击侦听器。
有一件事要确定的是,另一种观点不在你想要点击的视图之上。 这在FrameLayouts(你的子LinearLayout可能被覆盖)中尤其常见,或者在相对布局中你可能忘记更新这一行:
android:layout_below="@id/shouldBeTheIdOfTheViewCurrentlyBeingCovered"
所以意见不填充相同的空间。
如果有问题的视图是TextView
,那么您可能需要将它们设置为focusable="false"
以便不使用第一次单击重点放在文本视图上。
该问题可能是从其layout中具有android:layout_height="fill_parent"
的textview。 如果这不能解决问题,问题可能是onClick()事件。 线性布局可能实际上不会调用onClick(),因为它的布局。 尝试覆盖onTouch()事件侦听器。
将以下属性添加到线性布局中未由子视图处理的任何单击事件将自动传递到LinearLayout。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ... android:focusable="true" android:clickable="true"> <child/> <child/> </LinearLayout>
我面临同样的问题,所有的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,但是然后我的孩子意见没有我需要的连锁反应。