我正在尝试将R.layout.simple_list_item_multiple_choice与ListView一起使用。 CheckedTextView用于simple_list_item_multiple_choice.xml,但是如何使复选框左对齐而不是右对齐?
答案 0 :(得分:41)
秘密在于android:checkMark使其为空
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/checked_text_single_choice"
android:layout_width="match_parent"
android:layout_height="52dp"
android:checkMark="@null"
android:gravity="center_vertical"
android:textAppearance="?android:attr/textAppearanceSmall"
android:drawableLeft="?android:attr/listChoiceIndicatorSingle"
android:drawableRight="@null"
android:textColor="@android:color/black"
/>
答案 1 :(得分:33)
创建自己的行模板并在CheckedTextView上设置android:drawableLeft。
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="fill_parent"
android:layout_height="40dip"
android:gravity="center_vertical"
android:paddingLeft="5dip"
android:drawableLeft="?android:attr/listChoiceIndicatorMultiple"
/>
或
android:drawableLeft="?android:attr/listChoiceIndicatorSingle"
答案 2 :(得分:10)
我认为你不能。查看source code,似乎一直在右侧绘制复选标记。而且,说实话,我会建议你坚持这一点,为了保持一致性 - Android因为其应用程序的UI不一致而一直受到打击。
如果有人用枪指着你的头,迫使你改变复选标记的位置,将CheckedTextView
子类改为OMGPleaseDontShootCheckedTextView
,并覆盖onDraw()
之类的方法,使用原始的调整版本更改图像和文本的位置。
答案 3 :(得分:10)
如果您希望复选框位于左侧,只需使用CheckBox
即可。也许这当然没关系,但CheckBox
可以包含文本。您可以通过添加XML属性android:text或调用setText()方法来定义该文本。实际上CheckBox
继承自Button
,继承自TextView
,这就是为什么它具有所有与文本相关的属性。
答案 4 :(得分:4)
您可以将drawable分配给drawableLeft属性,但它不会对您有任何好处,因为它不支持着色。 相反,我扩展了CheckedTextView:
public class LeftSideCheckedTextView extends CheckedTextView {
public LeftSideCheckedTextView(Context context) {
this(context, null, 0);
}
public LeftSideCheckedTextView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public LeftSideCheckedTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
Field mCheckMarkGravity = null;
try {
mCheckMarkGravity = this.getClass().getSuperclass().getDeclaredField("mCheckMarkGravity");
mCheckMarkGravity.setAccessible(true);
mCheckMarkGravity.set(this, Gravity.START);
} catch (Exception e) {
Logger.error(e);
}
}
}
在这里,我访问了隐藏字段mCheckMarkGravity,它在CheckedTextView中使用,但是根据此错误票证,无法通过样式属性进行访问:https://code.google.com/p/android/issues/detail?id=174517
答案 5 :(得分:2)
@ WonderCsabo建议使用CheckBox的一个例子。
<CheckBox
android:id="@+id/create_account_checkedTextView_password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Show"
android:gravity="center"
android:checked="true"
# relative layout params
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_above="@+id/hint1" />
答案 6 :(得分:2)
在此帖子中可以使用可检查布局的技巧 - https://chris.banes.me/2013/03/22/checkable-views/ 。只需使用像ListView项目布局这样的自定义布局:
<com.example.custom_view.CheckableLinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<CheckedTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checkMark="?android:attr/listChoiceIndicatorSingle"
android:duplicateParentState="true"
.../>
<TextView
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
.../>
</com.example.custom_view.CheckableLinearLayout>
或
android:checkMark=?android:attr/listChoiceIndicatorMultiple"
答案 7 :(得分:1)
看源代码,它只是基于布局方向。将其设置为RTL对我来说足够好。
android:layoutDirection="rtl"
来源:
private boolean isCheckMarkAtStart() {
final int gravity = Gravity.getAbsoluteGravity(mCheckMarkGravity, getLayoutDirection());
final int hgrav = gravity & Gravity.HORIZONTAL_GRAVITY_MASK;
return hgrav == Gravity.LEFT;
}
。
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
...
final boolean checkMarkAtStart = isCheckMarkAtStart();
final int width = getWidth();
final int top = y;
final int bottom = top + height;
final int left;
final int right;
if (checkMarkAtStart) {
left = mBasePadding;
right = left + mCheckMarkWidth;
} else {
right = width - mBasePadding;
left = right - mCheckMarkWidth;
}
...
}
}
}
答案 8 :(得分:0)
尝试这个并希望它会给你一些想法
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Connection lost sound alert"
android:layout_weight="10"
android:layout_gravity="center"
/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="2"
android:layout_gravity="right"
android:orientation="horizontal" >
<CheckBox android:id="@+id/checkbox_meat"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:onClick="onCheckboxClicked"/>
</LinearLayout>
</LinearLayout>
答案 9 :(得分:0)
如果有人仍在寻找解决方案而未在布局中选中复选框。在这里尝试解决方案。
Android ListView ArrayAdapter - checkbox/radio button arrangement
答案 10 :(得分:-3)
android:drawableLeft =“?android:attr / listChoiceIndicatorMultiple”:P