如何将checkTextView的复选框和文本置于android中心?

时间:2016-09-27 03:01:46

标签: android xml android-layout checkbox checkedtextview

我有activity_choose_number1.xml

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay" />

</android.support.design.widget.AppBarLayout>

<include layout="@layout/content_choose_number1" />

这是content_choose_number1.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="horizontal"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.abc.abc.ChooseNumber1"
    tools:showIn="@layout/activity_choose_number1">

    <ListView
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="center_horizontal"
        android:orientation="horizontal"
        android:id="@+id/listViewNumberList"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp" />

</LinearLayout>

这是secnumsinglechoice.xml

<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="match_parent"
    android:textAppearance="?android:attr/textAppearanceListItemSmall"
    android:checkMark="@null"
    android:drawableStart="?android:attr/listChoiceIndicatorSingle"
    tools:targetApi="ice_cream_sandwich"
    android:textSize="25dp"
    android:linksClickable="false"
    android:checked="false"
    android:paddingTop="20dp"
    android:paddingBottom="20dp" />

secnumsinglechoice.xml是android.R.layout.simple_list_item_single_choice的复制粘贴并进行了一些更改。

现在我需要的是将secnumusingchoice.xml的复选框和文本居中对齐。我还需要在列表视图的每个项目中将复选框放在文本的左侧

我尝试过的事情 1)如果我执行drawableLeft,它会在文本和复选框之间创建空格,但不会使两者都居中 2)如果我添加android:textAlignment =&#34; center&#34;然后它仍然居中对齐文本而不是复选框。 3)我在这里尝试了center text and checkmark of CheckedTextView,但我想在这里尝试更多代码。

请帮忙。感谢。

2 个答案:

答案 0 :(得分:2)

这就是你想要的吗

ng serve

结果

enter image description here

答案 1 :(得分:1)

为了让所有内容都正确居中,我们将CheckedTextView作为子类,并覆盖其onDraw()方法,首先测量合并的Drawable和文本宽度和填充,然后翻译在调用Canvas方法实际进行绘制之前,相应地super

import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.widget.CheckedTextView;
import android.text.Layout;

public class CenteredCheckedTextView extends CheckedTextView {
    public CenteredCheckedTextView(Context context) {
        this(context, null);
    }

    public CenteredCheckedTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        if (getCompoundDrawables()[0] == null) {
            super.onDraw(canvas);
        }
        else {
            // Left drawable and paddings width
            final float dw = getCompoundDrawables()[0].getIntrinsicWidth() + 
                             getPaddingLeft() + getCompoundDrawablePadding();
            // Text width
            final float tw = getMaxLineMeasure();

            canvas.save();
            canvas.translate((getWidth() - (dw + tw)) / 2f, 0f);
            super.onDraw(canvas);
            canvas.restore();
        }
    }

    private float getMaxLineMeasure() {
        final Layout layout = getLayout();
        final int lines = getLineCount();
        float m = 0, max = 0;

        for (int i = 0; i < lines; ++i) {
            m = getPaint().measureText(getText(),
                                       layout.getLineStart(i),
                                       layout.getLineEnd(i));
            if (m > max) {
                max = m;
            }
        }

        return max;
    }
}

CheckedTextView有一个checkMarkGravity属性,可以确定checkMark Drawable放在哪一端,但由于某些奇怪的原因,它不公开,所以我们只使用drawableLeft。例如:

<com.mycompany.myapp.CenteredCheckedTextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingTop="20dp"
    android:paddingBottom="20dp"
    android:textSize="25dp"
    android:drawableLeft="?android:attr/listChoiceIndicatorSingle" />

您可能需要稍微调整自定义类中的翻译和/或宽度值,以使所有内容与看起来居中的内容对齐,具体取决于Drawable具有的透明内在填充类型

screenshot