Android:使用TextView和Button onClick on LinearLayout

时间:2013-10-30 15:43:20

标签: android android-layout onclick android-xml

我有一个使用以下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>

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

这是正常的吗?我需要做什么才能在LinearLayout?/ / p>的任何地方调用onClick方法

10 个答案:

答案 0 :(得分:9)

这是您在LinearLayout中所需要的:

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

以及在你的类中调用xml的一些方法:

public void editActions(View view){

           //something TODO

    }

答案 1 :(得分:6)

直接在代码中为您的按钮添加onClick Action:

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 add

android:onClick="editActions"

到你的按钮

答案 2 :(得分:4)

我认为你应该使用TouchDelegate

  

Android提供了TouchDelegate类,使其成为可能   父母将儿童视角的可触摸区域扩展到儿童视野之外   界限。当孩子必须小但应该有孩子时,这很有用   更大的触摸区域。你也可以用这种方法缩小   如果需要,孩子的触摸区域。

答案 3 :(得分: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();
    }

答案 4 :(得分:2)

好吧,如果这个带有一些孩子的酒吧,并且您希望只有这个酒吧可以点击儿童区 - 请尝试为父母中的每个孩子添加此选项:

android:clickable="false"

当然为主要版面添加setOnClickListener,例如my blog

示例:

<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> 

答案 5 :(得分:1)

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

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

 android:clickable="false"

然后点击处理将 向上 转到

答案 6 :(得分:0)

我猜您应该为Button删除此参数:

android:duplicateParentState="true"

答案 7 :(得分:0)

  <select class="form-control" name="officeLocation" id="officeLocation" formControlName="officeLocation">
                                                <option *ngFor="let countryName of officeLocations" value="{{countryName.officeLocationName}}">{{countryName.officeLocationName}}</option>
                                        </select>

答案 8 :(得分: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侦听器。

答案 9 :(得分:0)

要消除复制粘贴代码,可以使用以下代码为所有儿童OnClickListener设置View

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);
        }
    }
}