Android (可扩展)ListView中的自定义复合按钮不可单击(但复选框可单击)

Android (可扩展)ListView中的自定义复合按钮不可单击(但复选框可单击),android,listview,button,expandablelistview,Android,Listview,Button,Expandablelistview,我有一个即将完成的应用程序,它使用可扩展的ListView,每个子行有一个切换按钮。我可以使用复选框或ToggleButton,但是底层的CompoundButton不支持按钮图形(wtf?)的水平居中。所以我 构建了我自己的,但使用它会使它在listview中不可查找 在常规布局中,自定义compoundbutton工作正常 一些魔法咒语似乎不见了,我不太确定那会是什么。我会感谢你的任何见解 package net.shangtai.listener; 导入android.widget.Com

我有一个即将完成的应用程序,它使用可扩展的ListView,每个子行有一个切换按钮。我可以使用复选框或ToggleButton,但是底层的CompoundButton不支持按钮图形(wtf?)的水平居中。所以我 构建了我自己的,但使用它会使它在listview中不可查找

在常规布局中,自定义compoundbutton工作正常

一些魔法咒语似乎不见了,我不太确定那会是什么。我会感谢你的任何见解

package net.shangtai.listener;
导入android.widget.CompoundButton;
导入android.content.Context;
导入android.content.res.TypedArray;
导入android.graphics.Canvas;
导入android.graphics.drawable.drawable;
导入android.util.AttributeSet;
导入android.view.Gravity;
类ImageToggle扩展复合按钮{
私人可拉拔纽扣;
公共图像切换(上下文){
super(上下文,null);
}
公共图像切换(上下文、属性集属性){
超级(上下文,属性,0);
}
公共图像切换(上下文上下文、属性集属性、int-defStyle){
超级(上下文、属性、定义样式);
}
@凌驾
公共空间缩进可提取(可提取d){
super.可缩进拉拔(d);
buttonDrawable=d;
}
@凌驾
受保护的void onDraw(画布){
如果(buttonDrawable!=null){
最终整数重力=getGravity();
final int height=buttonDrawable.getIntrinsicHeight();
final int width=buttonDrawable.getIntrinsicWidth();
int-top=0;
int-bottom=0;
int left=getWidth();
int right=getHeight();
开关(重力){
case.TOP:
top=0;
底部=高度;
打破
箱底:
top=getHeight()-高度;
底部=0;
打破
箱体重心垂直:
top=(getHeight()-height)/2;
底部=顶部+高度;
打破
case.LEFT:
左=0;
右=宽度;
打破
case.RIGHT:
左=getWidth()-宽度;
右=0;
打破
箱体重心水平:
左=(getWidth()-width)/2;
右=左+宽;
打破
案例重心:
左=(getWidth()-width)/2;
右=左+宽;
top=(getHeight()-height)/2;
底部=顶部+高度;
打破
}
按钮可拆卸。立根(左、上、右、下);
按钮可拆卸。绘制(画布);
}
}
}

如果您的
组视图
行中有自定义复选框,则此问题是否特别严重?您的复选框必须设置为不可聚焦,并且不能直接与groupview展开/折叠指示器相邻(请尝试在它们之间放置textview或其他内容)。出于某种原因,这就像是他们在争夺在点击时要表达什么的支配地位

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

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

  • 快速修复:在小部件的构造函数中设置clickable(true),除非android:clickable被显式设置为false。有人可能会争辩说按钮在默认情况下是可点击的,或者

  • 更详细的说明:请按照

  • 对于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>
    
    
    
    注:以下可能是所有这些都是必要的原因:

    不,正如我所写的,它在子视图中,而不是在组中。我曾尝试在xml和代码中将其设置为不可聚焦,但这没有效果(请注意,仅用复选框或切换按钮替换“mybutton”是可行的,只是不能将按钮图形居中)谢谢,我也花了一些时间来回复您,但这是一个很棒、清晰且详尽的答案。我做了一个小测试,android:clickable完全按照您描述的那样工作。