中心CheckBox内部可绘制

dav*_*ino 33 checkbox android padding drawable android-layout

我有一个CheckBox我想要在自己的边界内居中,而不是被推到一边.可能比解释更容易证明:

在此输入图像描述

请注意,它不居中.目前定义为:

<CheckBox
    android:id="@+id/checkbox_star"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:button="@drawable/btn_favorite"

    android:layout_gravity="center"
    android:minWidth="48dp" />
Run Code Online (Sandbox Code Playgroud)

没关系自定义按钮drawable.它与香草的行为相同CheckBox(小复选框的行为相同).

Sam*_*Sam 30

我认为问题是Checkbox小部件使用带有drawableLeft属性的常规TextView ,因为它也希望显示文本.(这就是为什么你看到它垂直居中,但略微偏向左边.)

如果您只是想要一个具有多个状态的图像按钮,我建议在状态列表选择器中使用ToggleButton和自定义图像.或者,您可以创建一个扩展ImageView并实现Checkable的自定义类.

  • 如果按钮尺寸大于图像尺寸,`ToggleButton`如何帮助图像居中? (15认同)
  • 只是为了澄清,CheckBox的按钮没有使用TextView drawableLeft。它自己绘制按钮,仅支持Gravity.BOTTOM或Gravity.CENTER_VERTICAL。https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/widget/CompoundButton.java#424 (2认同)

Dew*_*eed 18

我正在使用MaterialCheckBoxfrom material-components-android(或AppCompatCheckBox. 它们很相似)。

我发现如果 CheckBox 没有任何文本,则设置它android:minWidth="0dp"android:minHeight="0dp"可以删除所有填充并将可绘制对象居中。

  • 虽然这个答案效果很好,但它有一个问题:视图实际上变得更小,因此触摸框也变得更小。Material Design 指南建议触摸目标不小于 48x48 dp (https://material.io/design/usability/accessibility.html#layout-and-typography)。默认材质复选框正是该尺寸,因此不应将其变小。 (3认同)
  • @PNDA 我没有找到任何文档。我只是尝试了每种组合。 (2认同)

Eld*_*abu 13

您可以使用父布局来实现此目的:

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center">

    <CheckBox
        android:id="@+id/checkbox_star"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="Check box text" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的回复,但这就是为什么我说"中心[...]本身"而不是"中心[...]其他东西";-),否则我想我已经做过了.当您考虑窗口小部件的单击区域时,此问题非常相关. (2认同)
  • 我没有(或想要)任何文本,也没有解决手头的问题.这是关于创建一个大于其drawable的`CheckBox`,同时将所述drawable定位在中心而不是小部件边界的左侧.你说的不是那样做的. (2认同)

Hen*_*aWD 8

这种对齐问题可以通过CheckableImageView解决,CheckableImageView是一种View可以直接扩展ImageViewAppCompatImageView实现的自定义Checkable.它还有其他ImageView属性.

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.Checkable;
import android.widget.ImageView;

/**
 * @author hendrawd on 6/23/16
 */
public class CheckableImageView extends ImageView implements Checkable {

    public CheckableImageView(Context context) {
        super(context);
    }

    public CheckableImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    private boolean mChecked = false;

    private static final int[] CHECKED_STATE_SET = {android.R.attr.state_checked};

    @Override
    public int[] onCreateDrawableState(final int extraSpace) {
        final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
        if (isChecked())
            mergeDrawableStates(drawableState, CHECKED_STATE_SET);
        return drawableState;
    }

    @Override
    public void setChecked(boolean checked) {
        if (mChecked != checked) {
            mChecked = checked;
            refreshDrawableState();
        }
    }

    @Override
    public boolean isChecked() {
        return mChecked;
    }

    @Override
    public void toggle() {
        setChecked(!mChecked);
    }

    @Override
    public void setOnClickListener(final OnClickListener l) {
        View.OnClickListener onClickListener = new OnClickListener() {
            @Override
            public void onClick(View v) {
                toggle();
                l.onClick(v);
            }
        };
        super.setOnClickListener(onClickListener);
    }
}
Run Code Online (Sandbox Code Playgroud)

只需将您的选择器drawable设置为XML的src属性,并且将自动跟踪可绘制的检查状态.

使用示例

<your.package.name.CheckableImageView
    android:id="@+id/some_id"
    android:layout_width="48dp"
    android:layout_height="48dp"
    android:src="@drawable/set_your_selector_here"
    android:padding="14dp"
    android:gravity="center" />
Run Code Online (Sandbox Code Playgroud)

选择器示例(放在带有扩展名的drawable文件夹中.xml)

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ic_cb_check" android:state_checked="true" android:state_focused="true" />
    <item android:drawable="@drawable/ic_cb_uncheck" android:state_checked="false" android:state_focused="true" />
    <item android:drawable="@drawable/ic_cb_uncheck" android:state_checked="false" />
    <item android:drawable="@drawable/ic_cb_check" android:state_checked="true" />
</selector>
Run Code Online (Sandbox Code Playgroud)

使用您的首选图像更改ic_cb_checkic_cb_uncheck.

此代码也可在https://gist.github.com/hendrawd/661824a721c22b3244667379e9358b5f获取


j__*_*__m 5

android:button="@null"
android:foreground="@drawable/btn_favorite" 
android:foregroundGravity="center"
Run Code Online (Sandbox Code Playgroud)


tom*_*ozb 5

唯一合适的解决方案是向图像添加插图。大多数带有“前景”的解决方案都无法在API 23以下使用。

btn_favorite_inset.xml 在可绘制目录中

<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/btn_favorite"
    android:insetLeft="6dp"
    android:insetTop="6dp"
    android:insetRight="6dp"
    android:insetBottom="6dp" />
Run Code Online (Sandbox Code Playgroud)

您的布局文件

<CheckBox
    android:id="@+id/checkbox_star"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:button="@drawable/btn_favorite_inset"
    android:layout_gravity="center"
    android:minWidth="48dp" />
Run Code Online (Sandbox Code Playgroud)