我有一个带有较小TextView子级的自定义LinearLayout。 我希望能够单击TextView未覆盖的区域,因此我将clickable = true和onclicklistener设置为LinearLayout,但不会触发onClick。 如果我在TextView上设置onclick侦听器,它将按预期工作...
有人可以帮忙吗?
ar_item.xml
android:id="@+id/ar_item" android:layout_width="202dp"
android:layout_height="62dp" android:background="@drawable/bg_item_ar"
android:clickable="true">
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
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();
}
});
}
}
我有完全一样的问题,您找到解决方案了吗?
android:duplicateParentState="true"没有帮助我。
要使布局及其子项可点击,您需要为每个子项添加此选项:
android:clickable="false"
然后,点击处理将转到父项。
谢谢@Yurets,它的工作就像魔术一样。这必须是可以接受的答案
谢谢。也为我工作!
是的-工作。我的问题是我的孩子们是按钮(本质上可以点击),所以我不得不将它们更改为ImageViews。我不知道为什么首先要把它们作为按钮。
为每个孩子
android:duplicateParentState="true"
感谢这样做,解决了我类似的问题,即我有多个控件要表达"被单击"的视觉状态,而只需要在父级中处理事件。
虽然我仍然看到一个非常奇怪的问题-当我具有clickable = true,width / height = wrap / match时,它可以工作,但是如果我将它们放入一种样式并使用该样式,则不会(没有视觉点击状态,没有处理程序被解雇)。这是2.3;知道为什么会这样吗?
谢谢你!解决了我今天使用嵌套线性布局选择时遇到的一个问题。
@Blackbelt在这种情况下,我应该把这个android:duplicateParentState =" true"放在这里?线性布局或文本视图中。
LLs子项上的@jaydroider,所以我想是TextView
门槛需要设置每个孩子android:clickable =" false"
这并不总是有效的...。请参阅此... stackoverflow.com/a/31578111/5886712 ...或在此之下应用于子代> android:clickable =" false"
这不是您的情况,但是可点击的ViewGroup出现了类似的问题。在寻找一个解决方案一个小时后,发现我在ViewGroup内将android:inputType设置为TextView,这阻止了onClick()侦听器(不知道为什么)
Don't use android:inputType with TextView
谢谢!我不知道为什么我的TextView会拦截点击。
这也是我的问题,请确保您没有inputType或将其设置为none!感谢您发布
使您的父级LinearLayout的android:clickable =" true"
使所有childview的android:clickable =" false"
在Linearlayout下-从TextView中删除android:inputType ="
android:duplicateParentState="true"使我的TextView看起来像已被禁用,并且无法接收单击事件。
您只需要设置TextView clickable="false"。因此,click事件将调度到父布局,并且TextView仍然可以对touch事件做出反应(具有波纹效果)。
您没有使用自定义视图;您正在使用标准的LinearLayout。您的XML标签应为:
...
@jul您尝试过这个吗?
TextView的高度覆盖整个父级(整个布局),因此您可以单击空白区域,但不能单击布局。尝试为您的TextView使用wrap_content用于android:layout_height。还要为布局设置点击监听器。
TextView的宽度小于其父级的宽度,因此应该在Linearlayout的右侧保留一个可单击的区域。
如果所讨论的视图是TextView,则可能需要将它们设置为focusable="false",这样就不会使用第一次单击来关注文本视图。
要确保的一件事是,另一个视图不在您尝试单击的视图之上。这在FrameLayouts(可能覆盖了您的子LinearLayout)中或在相对布局中尤其常见,您可能忘记更新此行:
android:layout_below="@id/shouldBeTheIdOfTheViewCurrentlyBeingCovered"
这样视图就不会占据相同的空间。
为LinearLayout创建变量
LinearLayout layout;
layout.setOnClicknersetOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
Toast t = Toast.makeText(context,"hey!", Toast.LENGTH_SHORT);
t.show();
}
});
我遇到了同样的问题,并且所有XML属性均不起作用。我认为发生这种情况是因为我以编程方式使视图膨胀并添加了视图。对我来说,解决方法是-也是通过编程-将膨胀后的根视图设置为不可点击:
View view = layoutInflater.inflate(R.layout.some_layout, someLinearLayout, false);
view.setClickable(false);
(是的,我尝试使some_layout在XML中不可点击。)
上面的解决方案都不适合我。后来我发现LinearLayout中的LinkMovementMethod设置为TextView。此类拦截触摸事件,单击事件和TextView的属性,例如clickable,focusable vs.。
我遇到了同样的问题,并且所有的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
子视图未处理的所有Click事件都将自动传递到LinearLayout。
...
android:focusable="true"
android:clickable="true">
问题可能出在布局中具有android:layout_height="fill_parent"的文本视图中。如果那不能解决问题,则问题可能出在onClick()事件上。由于线性布局是布局,因此实际上可能从未调用过onClick()。尝试改写onTouch()事件侦听器。