【问题标题】:Custom CompoundButton in (Expandable)ListView is not clickable (but a CheckBox is)(Expandable)ListView 中的自定义 CompoundButton 不可点击(但 CheckBox 是可点击的)
【发布时间】:2012-11-18 18:06:04
【问题描述】:

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

【问题讨论】:

    标签: android listview button expandablelistview


    【解决方案1】:

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

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

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

    2. 更详细:按照How to: Define theme (style) item for custom widget接受的答案中概述的程序

    对于 2,请确保为自定义小部件定义默认样式,例如style_imagetoggle.xml 具有“可点击”样式,例如父级的 Widget.CompoundButton,或直接设置 android:clickable=true: p>

    <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

    【讨论】:

    • 谢谢,我也有时间回复您,但这是一个很好、清晰且详尽的答案。我做了一个小测试,android:clickable 完全按照你的描述工作。
    【解决方案2】:

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

    【讨论】:

    • 不,正如我所写,它在子视图中,而不是在组中。我已经尝试在 xml 和代码中将其设置为不可聚焦,但这没有任何效果(请注意,只需将“mybutton”替换为 CheckBox 或 ToggleButton does 工作,只是你无法将按钮图形居中)
    猜你喜欢
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    相关资源
    最近更新 更多