(可扩展)ListView中的自定义CompoundButton不可单击(但是CheckBox是)

时间:2012-11-18 18:06:04

标签: android listview button expandablelistview

我有一个近乎完成的应用程序,它使用ExpandableListView,每个子行有一个切换按钮。我可以使用CheckBox或ToggleButton,但底层的CompoundButton不支持按钮图形的水平居中(wtf?)。所以我 构建我自己的,但不知何故使用它而不是在列表视图中使其无法点击。

在常规布局中,自定义复合按钮效果很好。

一些神奇的咒语似乎缺失了,我不太确定那会是什么。我会感谢您的任何见解。

package net.shangtai.listener;

import android.widget.CompoundButton;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.Gravity;

class ImageToggle extends CompoundButton {
    private Drawable buttonDrawable;

    public ImageToggle(Context context) {
        super(context, null);
    }
    public ImageToggle(Context context, AttributeSet attrs) {
        super(context, attrs, 0);
    }
    public ImageToggle(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public void setButtonDrawable(Drawable d) {
        super.setButtonDrawable(d);
        buttonDrawable=d;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        if (buttonDrawable != null) {
            final int gravity = getGravity();
            final int height = buttonDrawable.getIntrinsicHeight();
            final int width = buttonDrawable.getIntrinsicWidth();

            int top=0;
            int bottom=0;
            int left=getWidth();
            int right=getHeight();

            switch (gravity) {
                case Gravity.TOP:
                    top=0;
                    bottom=height;
                    break;
                case Gravity.BOTTOM:
                    top=getHeight() - height;
                    bottom=0;
                    break;
                case Gravity.CENTER_VERTICAL:
                    top=(getHeight() - height)/2;
                    bottom=top+height;
                    break;
                case Gravity.LEFT:
                    left=0;
                    right=width;
                    break;
                case Gravity.RIGHT:
                    left=getWidth() - width;
                    right=0;
                    break;
                case Gravity.CENTER_HORIZONTAL:
                    left=(getWidth() - width)/2;
                    right=left+width;
                    break;
                case Gravity.CENTER:
                    left=(getWidth() - width)/2;
                    right=left+width;
                    top=(getHeight() - height)/2;
                    bottom=top+height;
                    break;
            }

            buttonDrawable.setBounds(left, top, right, bottom);
            buttonDrawable.draw(canvas);
        }
    }
}

2 个答案:

答案 0 :(得分:1)

我认为缺少的魔力是自定义自定义小部件的属性,特别是 android:clickable = true 。也许令人惊讶的是,默认情况下,按钮不可点击;这是通过造型来设定的。

现在,如果这是您的问题,可以通过以下两种方法解决此问题:

  1. 快速修复: setClickable(true)在您的窗口小部件的构造函数中,可能除非 android:clickable 已明确设置为< EM>假。有人可能认为按钮可以默认点击,或者

  2. 更详细:按照How to: Define theme (style) item for custom widget

  3. 的接受答案中列出的程序进行操作

    对于2,请确保为自定义窗口小部件定义默认样式,例如: style_imagetoggle.xml 具有可点击的&#39;父级的 Widget.CompoundButton 等样式,或者直接设置 android:clickable = true

    <resources>
        <!-- Default style attribute values, can be expanded upon in themes -->
        <style name="Widget.CompoundButton.ImageToggle" parent="@android:style/Widget.CompoundButton" />
    </resources>
    

    注意:以下可能是为什么所有这些都是必要的: Issue 12683: Problem with the defStyle parameter of the View class constructor

答案 1 :(得分:0)

如果groupView行中的自定义复选框,是否会出现此问题?您的复选框必须设置为不可聚焦 AND 它不能直接与groupview展开/折叠指示符相邻(尝试在它们之间放置textview或其他内容)。出于某种原因,这就像他们争取在点击时表达的优势一样。