Подтвердить что ты не робот

Центр CheckBox доступен внутри себя

У меня есть CheckBox, который я хочу сосредоточить в пределах его собственных границ, а не отодвигаться в сторону. Вероятно, проще продемонстрировать, чем объяснить:

enter image description here

Обратите внимание, что он не центрирован. В настоящее время определено как:

<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" />

Не обращайте внимание на настраиваемую кнопку. Он ведет себя одинаково с ванилью CheckBox (небольшой флажок ведет себя одинаково).

4b9b3361

Ответ 1

Я считаю, что проблема заключается в том, что виджет Checkbox использует обычный TextView с атрибутом drawableLeft, потому что он ожидает, что текст будет показан как Что ж. (Вот почему вы видите его по центру вертикально, но слегка смещены влево.)

Если вы просто хотите кнопку изображения с несколькими состояниями, я предлагаю использовать ToggleButton с вашими пользовательскими изображениями в селектор списка состояний. Или вы можете создать собственный класс, который расширяет ImageView и реализует Checkable.

Ответ 2

Для достижения этой цели вы можете использовать родительский макет:

<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>

Ответ 3

android: button = "@null" android: foreground = "@drawable/btn_favorite" android: foregroundGravity = "center"

Ответ 4

Это будет работать исправно по мере необходимости. Просто небольшие изменения фона и атрибутов кнопок. Этот фрагмент кода успешно протестирован. Надеюсь, это поможет.

 <CheckBox
android:id="@+id/checkbox_star"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:background="@drawable/btn_favorite"
android:button="@color/transparent"
android:layout_gravity="center"
android:minWidth="48dp" />

Ответ 5

Если вы хотите, чтобы ImageView был доступен для проверки, вы можете увидеть мой смысл здесь https://gist.github.com/hendrawd/661824a721c22b3244667379e9358b5f

или см. полный код ниже

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);
    }
}

Просто установите селектор на тэг src вашего XML, и после этого будет проверено состояние проверки. Это позволит решить проблему с выравниванием CheckBox и иметь другие атрибуты ImageView.

Пример использования:

<your.package.name.CheckableImageView
    android:id="@+id/some_id"
    android:layout_width="48dp"
    android:layout_height="48dp"
    android:src="@drawable/drawable_selector_of_your_choice"
    android:padding="14dp"
    android:gravity="center" />

Ответ 6

Не используйте этот код для обхода ошибки флажка с центральным псевдонимом для > SDK23, если вы собираетесь использовать флажки в recyclerview.

<CheckBox
android:button="@null"
android:drawableLeft="@drawable/checkbox_selector"
android:drawableStart="@drawable/checkbox_selector"
/>

Флажки не будут проверяться в onBindViewHolder до следующего обновления, если RV (пример: прокрутка,..).