如何使Android CheckedTextView中的Checkbox保持对齐而不是右对齐?

时间:2010-06-25 00:02:42

标签: android

我正在尝试将R.layout.simple_list_item_multiple_choice与ListView一起使用。 CheckedTextView用于simple_list_item_multiple_choice.xml,但是如何使复选框左对齐而不是右对齐?

11 个答案:

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

checkbox_example

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