7

我有一个使用以下 XML 布局的片段:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/card"
    android:clickable="true"
    android:onClick="editActions"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/title"
        style="@style/CardTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:duplicateParentState="true"
        android:text="@string/title_workstation" />

    <Button
        android:id="@+id/factory_button_edit"
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:duplicateParentState="true"
        android:text="@string/label_edit" />

</LinearLayout>

如您所见,我设置了onClick参数LinearLayout。现在TextView这个被正确触发了,并且在所有空白区域。就在Button它不会调用我设置的 onClick 方法。

这是正常的吗?我该怎么做才能在 ? 上的任何地方调用 onClick 方法LinearLayout

4

10 回答 10

12

这是您在 LinearLayout 中需要的:

android:onClick="editActions" 
android:clickable="true"

以及在您的类中调用该xml的某些方法:

public void editActions(View view){

           //something TODO

    }
于 2013-11-13T22:13:27.903 回答
7

直接在如下代码中为您的按钮添加 onClick 操作:

Button btn = findViewById(R.id.factory_button_edit);
btn.setOnClickListener(button_click);

      OnClickListener button_click = new OnClickListener() {

        @Override
        public void onClick(View v) {
            editActions;
        }
    };

或 xml 添加

android:onClick="editActions"

到你的按钮

于 2013-10-30T15:56:34.087 回答
4

我认为您应该使用TouchDelegate

Android 提供了 TouchDelegate 类,使父视图可以将子视图的可触摸区域扩展到子视图之外。当孩子必须很小但应该有更大的触摸区域时,这很有用。如果需要,您也可以使用这种方法来缩小孩子的触摸区域。

于 2013-10-30T15:51:04.300 回答
3

要使您的布局可以与其子级一起单击,您需要为每个级添加此选项:

 android:clickable="false"

然后点击处理将上升parent

于 2015-07-23T04:26:26.637 回答
2

尝试这样做

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/card"
    android:clickable="true"
    android:onClick="editActions"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/title"
        style="@style/CardTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/title_workstation" />

    <Button
        android:id="@+id/factory_button_edit"
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="clickMe"
        android:text="@string/label_edit" />

</LinearLayout>

并在您的活动或片段上

    public void editActions(View v) {
        Toast.makeText(this, "Layout", Toast.LENGTH_SHORT).show();
    }

    public void clickMe(View v) {
        Toast.makeText(this, "clickMe", Toast.LENGTH_SHORT).show();
    }
于 2013-10-30T16:01:51.077 回答
2

好吧,如果这是一个带有一些孩子的栏,并且您只想让这个栏与孩子区域一起点击 - 尝试为父母中的每个孩子添加此选项:

android:clickable="false"

当然添加setOnClickListener主布局,例如在我的博客上

例子:

<LinearLayout  
      android:id="@+id/parent"  
      android:layout_width="match_parent"  
      android:layout_height="wrap_content"  
      android:orientation="horizontal">  
      <ImageButton  
           android:clickable="false"  
           android:layout_width="40dp"  
           android:layout_height="40dp"  
           android:text="Cinema"  
           android:textSize="13sp"  
           android:layout_marginRight="10dp" />  
      <Button  
           android:clickable="false"  
           android:layout_width="match_parent"  
           android:layout_height="40dp"  
           android:text="Check in"  
           android:textSize="13sp"/>  
 </LinearLayout> 
于 2014-04-28T08:23:47.660 回答
0

我想你应该为你的按钮删除这个参数:

android:duplicateParentState="true"
于 2013-10-30T16:02:54.223 回答
0
View.OnClickListener myViewHandler = new View.OnClickListener() {
        public void onClick(View v) {
                RelativeLayout pressedRelViewx = (RelativeLayout) v;
                TextView pressedTextView = (TextView) pressedRelViewx.getChildAt(0);
                String text = pressedTextView.getText().toString();
                Toast.makeText(getApplicationContext() , "My Text "+ text , Toast.LENGTH_LONG).show() ;
        }
    };


Relative_Layout = (RelativeLayout)findViewById(R.id.my_container);
Relative_Layout.setOnClickListener(myViewHandler);
于 2017-11-30T09:02:43.567 回答
0

好的,这可能会迟到,但它会帮助其他正在寻找的人

如何为布局 [android] 设置 onClick 侦听器。

LinearLayout mLinearLayout = findViewById(R.id.your_linear_layout_name);

mLinearLayout.setonClickListener(new View.onClickListener(){
   @Overide
   public void onClick(View v){
     //do want to do here

    }

});

笔记:

当按钮位于已经在侦听 onClick 的线性布局内时,您不能在按钮上执行 onClick 侦听器,如果这样做,则单击第一个父级(线性布局)。最好不要执行嵌套的 onClick 侦听器。

于 2018-08-23T06:47:39.543 回答
0

要消除复制粘贴代码,您可以将 a 设置OnClickListener为所有的 chidlrenView的代码:

private void setClickListenerRecursively(View view, View.OnClickListener listener){
    view.setOnClickListener(listener);

    if(view instanceof ViewGroup){
        ViewGroup viewGroup = (ViewGroup) view;
        for(int i = 0; i < viewGroup.getChildCount(); i++){
            View child = viewGroup.getChildAt(i);
            setClickListenerRecursively(child, listener);
        }
    }
}
于 2020-07-09T11:24:45.053 回答