【问题标题】:Android -List View containing buttons and textview no longer selectableAndroid - 包含按钮和文本视图的列表视图不再可选择
【发布时间】:2012-03-01 09:12:17
【问题描述】:

我在这个网站上浏览过很多关于无法选择按钮和文本视图的列表视图的帖子。但是我的问题不同,我无法从其他相关帖子中得出结论。 我有一个由 BaseAdapter 填充的列表视图。列表视图的布局是左侧有 2 个文本视图,每行右侧有一个按钮。我希望能够选择按钮以及列表视图的整行。

我知道按钮在使用时会获得焦点。有人能告诉我如何让按钮和整行都可以选择吗?

问候, 阿吉特

【问题讨论】:

  • 整行可选,意味着当你改变颜色时选择?
  • 我希望整行和按钮都可以选择。我的意思是当我点击按钮以外的其他人时,应该选择整行并进行一些活动。当我点击按钮时,按钮应该被按下并执行一些活动。

标签: android listview button selectable focusable


【解决方案1】:

将 android:onClick 属性添加到布局 XML 中的按钮。

android:onClick

单击视图时要在此视图的上下文中调用的方法的名称。此名称必须对应于只采用一个 View 类型参数的公共方法。例如,如果您指定 android:onClick="sayHello",则必须为您的上下文(通常是您的 Activity)声明一个 public void sayHello(View v) 方法。

【讨论】:

    【解决方案2】:

    是的,您可以通过在布局中将按钮的可聚焦设置为 false 来做到这一点,这样做会解决您的问题

    只有当列表没有任何可聚焦的元素时,它才会点击。因此,如果您想单击列表和按钮,则将按钮的焦点设置为 false。通过这个你可以点击按钮和整个列表

    【讨论】:

    • 我确实做到了。但这使得列表的行可以选择,而不是按钮。我希望整行和按钮都可以选择。我的意思是当我点击按钮以外的其他人时,应该选择整行并进行一些活动。当我点击按钮时,按钮应该被按下并做一些活动。我在这里错过了什么吗?
    • 这里我们首先关注列表和按钮的点击事件。现在列表只会在它没有任何可聚焦的元素时单击。因此,如果您想单击列表和按钮,则将按钮的焦点设置为 false。通过这个你可以点击按钮和整个列表
    • 非常感谢。虽然这可行,但从用户的角度来看,似乎会产生点击声音,但按下按钮的感觉并没有出现,因为可聚焦已更改为 false。再次感谢
    【解决方案3】:

    我也遇到了同样的问题,下面是我如何在 Android API 级别 16 上解决它的示例代码。最重要的是拥有 android:clickableandroid:focusable 设置为 true。

    在您的行 XML 文件中:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/row_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:drawable/list_selector_background"
        android:clickable="true"
        android:focusable="true"
        android:gravity="center_vertical"
        android:orientation="horizontal"
        android:padding="5dp" >
    
        <TextView
            android:id="@+id/label"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1" />
    
        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/button" />
    
    </LinearLayout>
    

    在你的基础适配器中,你可以设置监听器做一些事情:

    public class MyBaseAdapter extends BaseAdapter {
    
        // Some other method implementation here...
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // Initialize the convertView here...
    
            LinearLayout layout = (LinearLayout) convertView.findViewById(R.id.row_layout);
            Button button = (Button) convertView.findViewById(R.id.button);
    
            layout.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    Toast.makeText(context, "Row clicked!", Toast.LENGTH_LONG).show();
                }
            });
            button.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    Toast.makeText(context, "Button clicked!", Toast.LENGTH_LONG).show();
                }
            });
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-19
      • 2014-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-17
      相关资源
      最近更新 更多