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

У меня есть 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" /> 

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

Solutions Collecting From Web of "Центр CheckBox доступен внутри себя"

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

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

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

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

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

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

Если вы хотите, чтобы 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" /> 

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

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

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