ListView中带有按钮的列表项会吞噬触摸事件

5
我正在开发一款安卓应用程序,其中我展示了一个物品列表并允许用户点击星形图标将物品添加到收藏夹中,这些物品会在单独的活动中显示。
为了实现这个列表,我使用了RelativeLayout布局,其中包括一个ImageView作为图标,一个TextView作为物品名称以及一个Button作为收藏按钮。
我遇到的问题是,如果没有按钮,列表项可以正确响应触摸,并出现发光效果。但是加上按钮后,它们就无法正确地发光,不过它们会执行任何我放置在relativeLayout的android:onClick xml属性中的方法。
有人知道如何解决这种行为问题吗?
3个回答

8
使用 ImageButton 时,您需要调用:
myImageButton.setFocusable(false);

由于它的构造函数将其设置为true,因此需要以编程方式更改。您可以通过覆盖适配器的getView方法来实现:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = super.getView(position, convertView, parent);
    view.findViewById(R.id.idOfYourImageButton).setFocusable(false);
    return view;
}

1

1

关于这个问题,stackoverflow上有很多相关的提问,但是似乎没有一个简单的解决方案,所以我在这里分享一下我的解决方法:

我的具体例子涉及到一个ListFragment,列表视图中的每个项目都包含一个标准按钮。我希望按钮和列表视图可以分别点击。

在ListFragment中添加以下代码:

    @Override
    public void onActivityCreated (Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        this.getListView().setItemsCanFocus(false);
    }

在行项目的 xml 中,将以下内容添加到按钮 XML 中:
android:focusable="false"

就是这样。对我很有用。


这个解决方案是否仍然支持通过轨迹球进行聚焦?希望能够支持轨迹球,因为许多旧手机仍在使用它们。 - Michael Allen
另一个小问题:单击行会使按钮显示其按下状态,即使它在行上注册了onListItemClick(而不是Button的onClick)。有什么解决办法吗? - Karakuri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接