Центр 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
(небольшой флажок ведет себя одинаково).
Ответы
Ответ 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 (пример: прокрутка,..).