【问题标题】:Android: OnClick/TouchListener on View not delegated to ImageButton/View inside LinearLayoutAndroid:View 上的 OnClick/TouchListener 未委托给 LinearLayout 内的 ImageButton/View
【发布时间】:2016-02-15 17:36:44
【问题描述】:

我有一个菜单弹出活动,其中包含一些要单击的菜单点。一个菜单项具有这种模式:

menu entry text [IMAGE]

如果用户点击文本,点击监听器就会工作。如果用户点击ImageView,尽管监听器设置在周围的LinearLayout上,但监听器不起作用。 首先,我使用了ImageButton 而不是ImageView。但是两者都不会调用单击侦听器。我尝试添加这些属性:

android:clickable="true"
android:focusable="false"
android:focusableInTouchMode="false"

不起作用。
我尝试了onTouchListener 而不是onClickListener,也不起作用。任何想法如何使图像也可点击?这是代码的重要部分:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/screen_menupopup"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/transparent_black"
    android:orientation="vertical" >

    <LinearLayout
        android:id="@+id/menu_item_container"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:orientation="vertical" >

        <LinearLayout
            android:id="@+id/item_sort_abc_asc"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="right"
            android:orientation="horizontal" >

            <TextView
                android:id="@+id/sort_abc_asc"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:gravity="center_vertical"
                android:text="@string/cookbook_sort_abc_asc"
                android:textColor="@color/white" />

            <ImageView
                android:id="@+id/button_menu_item"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@color/transparent"
                android:clickable="true"
                android:focusable="false"
                android:focusableInTouchMode="false"
                android:src="@drawable/ic_configbutton_item" />
        </LinearLayout>
    ....

活动代码:

View viewSortAsccending = findViewById(R.id.item_sort_abc_asc);
viewSortAsccending.setOnClickListener(new View.OnClickListener()
{
    @Override
    public void onClick(View arg0)
    {
        Intent returnIntent = new Intent();
        returnIntent.putExtra(RequestCode.SORT_ORDER_ALPHABETICAL_ASC.toString(), true);
        setResult(RESULT_OK, returnIntent);
        menuItemContainer.startAnimation(animationFadeOut);
    }
});

【问题讨论】:

  • 你试过LinearLayout viewSortAsccending = (LinearLayout) findViewById(R.id.item_sort_abc_asc);并删除 ImageView 中的所有 android:clickable="true" android:focusable="false" android:focusableInTouchMode="false"
  • 把所有相关代码放上去,有些问题可能出在“不太重要”的那几行。
  • 您尝试设置android:descendantFocusability ="beforeDescendants" 吗?有了这个 ViewGroup (LinearLayout) 将在它的孩子之前获得焦点
  • @Chol 你是对的,这就是解决方案。将其发布为答案,以便我接受。

标签: android android-layout android-linearlayout onclicklistener


【解决方案1】:

你可以试试:

LinearLayout viewSortAsccending = (LinearLayout) findViewById(R.id.item_sort_abc_asc);

并删除imageView中的以下所有参数:

android:clickable="true" android:focusable="false" android:focusableInTouchMode="false"

LinearLayout 将按预期处理 OnClick。 但其实我不知道为什么如果不将视图投射到LinearLayout,行为就不一样了?如果有人有答案,很高兴更新这篇文章。

【讨论】:

  • 我没有强制转换,因为设置监听器不需要它,而且它节省了计算时间(因为不存在强制转换)
【解决方案2】:

将 Imageview 的 XML 更改为:

<ImageView
            android:id="@+id/button_menu_item"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@color/transparent"
            android:clickable="true"

            android:onClick="imageview_button"

            android:src="@drawable/ic_configbutton_item" />

然后将您的活动代码更改为:

    public void imageview_button(View view) {
            Intent returnIntent = new Intent();
    returnIntent.putExtra(RequestCode.SORT_ORDER_ALPHABETICAL_ASC.toString(), true);
    setResult(RESULT_OK, returnIntent);
    menuItemContainer.startAnimation(animationFadeOut);
}

在这里工作正常! 希望这会有所帮助。

【讨论】:

  • 在你的情况下 ImageView 响应点击,但他希望 LinearLayout 做到这一点
  • @Edik 这不是我想要的。亚历山大是对的。两者都应该是可点击的。
  • @AlexanderTumanin 我明白了,抱歉回答错误。如果你弄清楚了,请告诉我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-09
相关资源
最近更新 更多