我有一个带有较小TextView子项的自定义LinearLayout。我希望能够单击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();
}
});
}
}
答案 0 :(得分:85)
android:duplicateParentState="true"
没有帮助我。
要使您的布局可以与其子项一起使用,您需要为每个 孩子 添加此选项:
android:clickable="false"
然后点击处理将 向上 转到 父 。
答案 1 :(得分:55)
为每个孩子
机器人:duplicateParentState = “真”
答案 2 :(得分:20)
这不是你的情况,但我在点击ViewGroup
时遇到了类似的问题。在寻找解决方案一小时后,发现我在android:inputType
内TextView
设置了ViewGroup
阻止了onClick()
监听器(不明白为什么)
不要将
一起使用android:inputType
与TextView
答案 3 :(得分:2)
您的TextView高度覆盖整个父级(整个布局),因此您可以单击空白区域而不是布局。尝试使用wrap_content for android:layout_height为您的TextView。同时为布局设置单击侦听器。
答案 4 :(得分:2)
您没有使用自定义视图;你正在使用标准的LinearLayout。您的XML标记应为:
<com.yourcode.ARView ...> ... </com.yourcode.ARView>
答案 5 :(得分:2)
android:duplicateParentState="true"
使我的 TextView 看起来已被禁用,并且无法接收点击事件。
您只需设置 TextView clickable="false"
即可。因此,click事件将调度到父布局, TextView 仍然可以对触摸事件做出反应(具有连锁效果)。
答案 6 :(得分:1)
要确保的一件事是另一个视图不在您尝试单击的视图之上。这在FrameLayouts(可能覆盖您的子LinearLayout)或相对布局中尤其常见,您可能忘记更新此行:
android:layout_below="@id/shouldBeTheIdOfTheViewCurrentlyBeingCovered"
以便观看次数不会填充相同的空间。
答案 7 :(得分:1)
让你的父母LinearLayout android:clickable =&#34; true&#34;
制作所有儿童视图 android:clickable =&#34; false&#34;
在Linearlayout下 - 从TextView中删除 android:inputType =&#34;&#34;
答案 8 :(得分:0)
问题可能来自其布局中android:layout_height="fill_parent"
的textview。如果这不能解决问题,则问题可能是onClick()事件。线性布局实际上可能不会调用onClick(),因为它的布局。请尝试改写onTouch()事件侦听器。
答案 9 :(得分:0)
如果相关观看次数为TextView
,您可能需要将其设置为focusable="false"
,以便不会将第一次点击重点放在文字视图上。
答案 10 :(得分:0)
将以下属性添加到linearlayout 任何未由子视图处理的Click事件都将自动传递给LinearLayout。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
...
android:focusable="true"
android:clickable="true">
<child/>
<child/>
</LinearLayout>
答案 11 :(得分:0)
我遇到了同样的问题,并且所有的XML属性都没有用。我不确定是否会发生这种情况,因为我以编程方式膨胀并添加了视图,但这就是我解决问题的方法。
我有一个使用TextView和ImageView扩展LinearLayout的类。 在给布局充气并获取视图之后,我为子视图分配了一个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,但后来我的孩子观点没有产生连锁反应,这是我需要的。
答案 12 :(得分:0)
以上所有解决方案都不适合我。我注意到LinkMovementMethod
内的TextView
设置为LinearLayout
。此类拦截触摸事件,点击事件和TextView
的属性,例如可点击,可聚焦的vs ..
答案 13 :(得分:0)
为LinearLayout创建变量
LinearLayout layout;
layout.setOnClicknersetOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
Toast t = Toast.makeText(context, "hey!", Toast.LENGTH_SHORT);
t.show();
}
});