【问题标题】:onClick not triggered on LinearLayout with childonClick 未在带有子项的 LinearLayout 上触发
【发布时间】:2011-10-09 11:36:15
【问题描述】:

我有一个带有较小 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>

我的自定义线性布局

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 onclick android-linearlayout


【解决方案1】:

您的 TextView 高度覆盖整个父级(整个布局),因此您可能会单击空白区域而不是布局。尝试为您的 TextView 使用 android:layout_height 的 wrap_content。为布局设置点击监听器。

【讨论】:

  • TextView的宽度比它的parent要小,所以Linearlayout的右边应该有一个可点击的区域。
【解决方案2】:

您没有使用自定义视图;您正在使用标准的线性布局。您的 XML 标记应该是:

<com.yourcode.ARView ...> ... </com.yourcode.ARView>

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      每个孩子

      android:duplicateParentState="true"

      【讨论】:

      • 谢谢你,解决了我的类似问题,即我有多个控件想要表达“点击”的视觉状态,而只需要处理父级中的事件。
      • 虽然我仍然看到一个非常奇怪的问题 - 当我有 clickable = true, width/height=wrap/match 时,它可以工作,但如果我将它们放入一个样式并使用该样式,它没有(没有视觉“点击”状态,没有触发处理程序)。这是2.3;知道为什么会发生这种情况吗?
      • 谢谢!解决了我今天遇到的嵌套线性布局选择问题。
      • 仍然需要设置每个孩子 android:clickable="false"
      • 这并不总是有效 .... 参考这个 ... stackoverflow.com/a/31578111/5886712... 或在下面应用到孩子 > android:clickable="false"
      【解决方案5】:

      要确保的一件事是,另一个视图不在您尝试单击的视图之上。这在 FrameLayouts(您的子 LinearLayout 可能被覆盖)或相对布局中尤其常见,您可能忘记更新这一行:

      android:layout_below="@id/shouldBeTheIdOfTheViewCurrentlyBeingCovered"
      

      这样视图就不会填充相同的空间。

      【讨论】:

        【解决方案6】:

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

        为了让你的布局可以点击它的子元素,你需要为每个子元素添加这个选项:

         android:clickable="false"
        

        然后点击处理将向上父级

        【讨论】:

        • 谢谢@Yurets,它就像魔术一样工作。这一定是可以接受的答案
        • 谢谢。也为我工作!
        • 是的 - 工作。我的问题是我的孩子是按钮(本质上是可点击的),所以我不得不将它们更改为 ImageViews。我不知道为什么我一开始就把它们当作按钮。
        • 如果布局中必须有可点击的子级怎么办???
        • 那么你跳过为那些孩子设置android:clickable="false"。 @ekashking
        【解决方案7】:

        这不是你的情况,但我在可点击的ViewGroup 上遇到了类似的问题。在寻找解决方案一小时后发现我在我的ViewGroup 中将android:inputType 设置为TextView,这阻塞了onClick() 监听器(不知道为什么)

        不要在 TextView 中使用 android:inputType

        【讨论】:

        • 谢谢!我不明白为什么我的 TextView 会拦截点击。
        • 这也是我的问题,请确保您没有 inputType 或将其设置为 none!感谢您发布此内容
        • 好吧,没有什么对我有用,除非我遇到你的答案,否则我的 textview 有输入类型。
        【解决方案8】:

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

        【讨论】:

          【解决方案9】:

          在线性布局中添加以下属性 任何未由子视图处理的 Click 事件都将自动传递给 LinearLayout。

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

          【讨论】:

            【解决方案10】:

            android:duplicateParentState="true" 让我的 TextView 看起来像是被禁用了,无法接收点击事件。

            您只需要设置 TextView clickable="false"。所以点击事件会分派给父布局,TextView 仍然可以对触摸事件做出反应(带有涟漪效应)。

            【讨论】:

              【解决方案11】:

              我遇到了同样的问题,所有的 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,但是我的子视图没有我需要的涟漪效应。

              【讨论】:

                【解决方案12】:

                以上解决方案都没有为我提供。然后我注意到LinkMovementMethod 在我的LinearLayout 中设置为TextView。该类拦截TextView的触摸事件、点击事件和属性如可点击、可聚焦vs..

                【讨论】:

                  【解决方案13】:

                  让你的父 LinearLayout 的 android:clickable="true"

                  制作所有childview的android:clickable="false"

                  在线性布局下 - 从 TextView 中删除 android:inputType=""

                  【讨论】:

                    【解决方案14】:

                    我遇到了同样的问题,所有的 XML 属性都不起作用。我认为这是因为我以编程方式膨胀并添加视图。对我来说,解决方法是 - 也是以编程方式 - 将膨胀的根视图设置为不可点击:

                    View view = layoutInflater.inflate(R.layout.some_layout, someLinearLayout, false);
                    view.setClickable(false);
                    

                    (是的,我试图让some_layout 在 XML 中不可点击。)

                    【讨论】:

                      猜你喜欢
                      • 2015-11-21
                      • 1970-01-01
                      • 1970-01-01
                      • 2023-03-20
                      • 1970-01-01
                      • 1970-01-01
                      • 2022-01-15
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多