2011-07-20 37 views
36

我有一个带有较小TextView子级的自定义LinearLayout。我希望能够点击未被TextView覆盖的区域,因此我将clickable = true和onclicklistener设置为LinearLayout,但onClick不会被触发。如果我在TextView上设置onclick监听器,它按预期工作...带触发器的LinearLayout上的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

我有完全相同的问题,你有没有找到解决的办法? – longhairedsi

回答

46

为每一个孩子

机器人:duplicateParentState =“真”

+1

感谢你的解决,我有类似的问题,有多个控件,我想表达一个“单击”的视觉状态,而只需要处理父项中的事件。 – Rollie

+0

虽然我仍然看到一个非常奇怪的问题 - 当我有clickable = true,width/height = wrap/match时,它可以工作,但是如果我将它们放入一个样式并使用该样式,则不会点击“状态,没有处理程序被解雇)。这是2.3;任何想法为什么可能会发生? – Rollie

+1

感谢您的支持!解决了我今天使用嵌套线性布局选择的问题。 –

1

你的TextView高度覆盖整个父(整体布局),所以你可能会点击空白空间,但不上布局。尝试使用适用于您的TextView的android:layout_height的wrap_content。设置布局的点击侦听器。

+0

TextView的宽度比其父项的宽度小,因此在Linearlayout的右侧应该保留可点击区域。 – jul

2

您没有使用您的自定义视图;你正在使用一个标准的LinearLayout。你的XML标记应该是:

<com.yourcode.ARView ...> ... </com.yourcode.ARView> 
+0

@jul你试过这个吗? – cdhabecker

0

的问题可能与在其布局android:layout_height="fill_parent" TextView的。如果这不能解决问题,则问题可能是onClick()事件。线性布局可能实际上并没有实际调用onClick(),因为它的布局。改为尝试覆盖onTouch()事件侦听器。

1

有一件事要确保的是,另一种观点是不是你尝试单击视图的顶部。这是FrameLayouts尤为常见(如您的子LinearLayout中可覆盖)或相对布局,你可能已经忘了更新这一行:

android:layout_below="@id/shouldBeTheIdOfTheViewCurrentlyBeingCovered" 

,这样的观点不填同一空间。

56

android:duplicateParentState="true"没有帮助我。

为了使您的布局可点击与它的孩子,你需要增加该选项为每个孩子

android:clickable="false" 

然后点击操作会高达

+1

谢谢你的回答! – Athos

+1

谢谢@收集它的工作就像魔术一样。这必须是可以接受的答案 –

+1

必须是可以接受的答案! – Moti

14

这不是你的情况,但我有类似的问题,可点击ViewGroup。寻找解决方案小时后发现,我设置android:inputTypeTextViewViewGroup这是阻止onClick()监听器(不知道为什么)

不要使用android:inputType与TextView的

+0

谢谢!我无法弄清楚为什么我的TextView拦截了点击。 – MrPlow

+2

这也是我的问题,请确保您没有inputType或将它设置为none!感谢您发布这个 –

+0

Ma maaan谢谢。 – Bolling

1

如果内有问题的视图是TextView s,您可能需要将它们设置为focusable="false",以便第一次点击不会专注于文本视图。

0

将以下属性添加到线性布局 未由子视图处理的任何单击事件将自动传递到LinearLayout。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    ... 
    android:focusable="true" 
    android:clickable="true"> 

<child/> 
<child/> 

</LinearLayout> 
1

android:duplicateParentState="true"使我的TextView看起来像它的禁用,不能接收click事件。

所有你需要的是设置TextViewclickable="false"。因此,点击事件将发送到父级布局,并且仍然可以对触摸事件做出反应(带有连锁效应)。

0

我面临同样的问题,所有的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,但后来我的孩子的意见没有足够的连锁反应,这是我需要的。

0

上面的解决方案都没有为我分出。比我注意到LinkMovementMethod设置为TextView在我的LinearLayout里面。这个类拦截触摸事件,点击事件和诸如可点击的TextView性能,可聚焦迎战。

0

让你的父母的LinearLayout的机器人:可点击=“真”

让所有的childview的的android:点击=“假”

下的LinearLayout - 删除安卓的inputType =“”从TextView的