0

ExpandableListViewを使用するほぼ完成したアプリがあり、子行ごとに1つのトグルボタンがあります。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からの属性の自動適用だと思います。おそらく驚くべきことに、ボタンはデフォルトではクリックできません。これはスタイリングによって設定されます。

これが問題である場合、これを修正する2つの方法があります。

  1. クイックフィックス:おそらくandroid: clickableが明示的にfalseに設定されていない限り、ウィジェットのコンストラクターでsetClickable(true)。ボタンはデフォルトでクリック可能であると主張することができます。

  2. より複雑:方法の受け入れられた回答に概説されている手順に従ってください :カスタムウィジェットのテーマ(スタイル)アイテムを定義する

2の場合、親のWidget.CompoundButtonなどの「クリック可能な」スタイルを持つstyle_imagetoggle.xmlなどで、カスタムウィジェットのデフォルトのスタイルを定義するか、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か?チェックボックスはフォーカス不可に設定する必要がありグループビューの展開/折りたたみインジケーターに直接隣接することはできません(テキストビューなどを間に入れてみてください)。どういうわけか、彼らはクリックしたときに何を表現するかを支配するために戦っているようなものです。

于 2012-11-19T06:24:23.190 に答える