0

我有一个几乎完成的应用程序,它使用 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);
        }
    }
}
4

2 回答 2

1

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

现在,如果这是您的问题,这里有两种解决方法:

  1. 快速修复:在小部件的构造函数中使用setClickable(true),除非android:clickable已明确设置为false。有人可能会争辩说 Button 在默认情况下是可点击的,或者

  2. 更详细:遵循 如何接受的答案中概述的过程:为自定义小部件定义主题(样式)项目

对于 2,确保在style_imagetoggle.xml中为自定义小部件定义默认样式,该样式具有“可点击”样式,例如父级的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>

注意:以下可能是所有这些都是必要的原因: 问题 12683:View 类构造函数的 defStyle 参数有问题

于 2014-09-02T15:58:54.543 回答
0

如果您的groupView行中的自定义复选框特别是这个问题?您的复选框必须设置为不可聚焦并且它不能直接与 groupview 展开/折叠指示器相邻(尝试在它们之间放置一个 textview 或其他东西)。出于某种原因,这就像他们在争夺点击时要表达的内容的主导权。

于 2012-11-19T06:24:23.190 回答