2016-09-27 3 views
1

У меня есть activity_choose_number1.xmlКак центрировать флажок и текст checkedTextView в android?

<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 = "center", то он все равно выравнивает текст, но не этот флажок. 3) Я попробовал здесь center text and checkmark of CheckedTextView, но я хотел бы попробовать здесь с большим количеством кода.

Пожалуйста, помогите. Благодарю.

+0

Я не знаю, что вы подразумеваете под «Я хотел бы попробовать здесь с большим количеством кода», но вы попробуйте 'gravity' атрибут? Например, 'android: gravity =" center_horizontal "'? –

+0

Почему вы не используете 'checkbox' и' textview' отдельно? Попробуйте использовать 'CheckedTextView' довольно сложно выровнять флажок и текст. –

+0

@MikeM. Да, я пробовал, что я все еще не работал. – user3705478

ответ

2

Это то, что вы хотите

<LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="40dp" 
     android:background="@android:color/white" 
     android:gravity="center"> 

     <CheckBox 
      android:id="@+id/ckb" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:checked="true" /> 

     <TextView 
      android:id="@+id/tvEduName" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="10dp" 
      android:text="ABC" 
      android:textSize="17sp" /> 
    </LinearLayout> 

Результат

enter image description here

+0

Проблема заключается в том, что количество параметров, отображаемых для пользователя, является динамическим. Например, для некоторых пользователей это может быть 5 записей, для некоторых это может быть 10 записей и т. Д. Я не могу жестко скопировать параметры, и мы не знаем, сколько опций мы получим. – user3705478

+0

Я думаю, что именно поэтому вы используете listview с динамическими данными. –

1

Чтобы правильно получить все до центра, мы подклассы CheckedTextView и переопределить его метод onDraw() к первому измерению комбинированную Drawable и ширины текста и paddings, а затем перевести 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, который определяет, на конце которого он помещает checkMarkDrawable, но это не публично, по какой-то причине, так что мы будем просто использовать 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

+0

Убедительные. Я еще не пробовал решение. Но когда вы говорите, что мне нужно слегка поиграть с значениями ширины, будет ли выравнивание выглядеть нецентрированным, если приложение используется в планшете или другом размере экрана? – user3705478

+0

Я не так много говорил о размере экрана, но больше о самозатяживающемся, возможно, имеющем прозрачную прокладку с обеих сторон, что могло бы показаться немного нецентральным. Даже круглая форма на скриншоте заставляет его выглядеть немного смещенным ко мне. Просто наглядное предпочтение, действительно. Ничего серьезного. –