【问题标题】:Android TextView Align text to Right and LeftAndroid TextView 将文本左右对齐
【发布时间】:2012-05-23 17:30:16
【问题描述】:

我正在尝试让 TextView 包含两段文本,一段与最左侧对齐,另一段与最右侧对齐。我可以在两个词之间加空格,但我想知道是否有更好的技巧?

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" 
    android:background="@drawable/background_common"
    android:id="@+id/LinearLayout0123">

   <TextView
        android:layout_width="300dp"
        android:layout_height="40dp"
        android:textColor="@color/Black"
        android:textStyle="bold"
        android:textSize="15dp"
        android:paddingLeft="10dp"
        android:paddingTop="10dp"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="10dp"
        android:background="@drawable/selector_social_facebook_twitter"
        android:text="Right Text                                  Left Text" />
</LinearLayout>

【问题讨论】:

    标签: android


    【解决方案1】:

    这是另一种方法:

    <FrameLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="@drawable/background_common">
        <TextView
            android:text="Left Text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="left"/>
        <TextView
            android:text="Right Text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="right"/>
    </FrameLayout>
    

    Layout_gravity 告诉父母把孩子放在哪里。在 FrameLayout 中,孩子可以去任何地方并且不受其他孩子的阻碍。如果有重叠,则添加的最后一个子级位于顶部。祝你好运!

    【讨论】:

    • 但是当你想使用后退按钮清除输入的文本时它不能正常工作,因为当你聚焦编辑文本时,它会将光标设置在输入文本的乞求处。
    【解决方案2】:

    为什么不用两个文本视图而不是将文本塞进一个文本视图中

    <LinearLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="horizontal" 
        android:layout_width="300dip"
        android:layout_height="fill_parent" 
        android:background="@drawable/background_common"
        android:id="@+id/LinearLayout0123">
    
       <TextView
            android:layout_weight="1"
            android:layout_width="0dip"
            android:layout_height="40dp"
            android:textColor="@color/Black"
            android:textStyle="bold"
            android:textSize="15dp"
            android:paddingLeft="10dp"
            android:paddingTop="10dp"
            android:layout_marginTop="10dp"
            android:layout_marginLeft="10dp"
            android:background="@drawable/selector_social_facebook_twitter"
            android:text="Left Text" />
    
       <TextView
            android:layout_weight="1"
            android:layout_width="0dip"
            android:layout_height="40dp"
            android:textColor="@color/Black"
            android:textStyle="bold"
            android:textSize="15dp"
            android:paddingLeft="10dp"
            android:paddingTop="10dp"
            android:layout_marginTop="10dp"
            android:layout_marginLeft="10dp"
            android:background="@drawable/selector_social_facebook_twitter"
            android:text="Right Text" />
    </LinearLayout>
    

    如果你想让文本向右对齐,你可以在右边的文本框上设置 android:gravity="right"

    【讨论】:

      【解决方案3】:

      如果您只需要一行(标签:...值,或类似的东西),您实际上可以使用Alignment 跨度来实现这一点。唯一的问题是,跨度适用于整个段落,因此您必须将左/右文本放入单独的段落中,并使用“零行高”跨度将它们合并为一行。

      类似这样的:

      public void setLeftRightText(TextView view, String left, String right) {
          SpannableString merged = new SpannableString(left + "\n" + right);
          merged.setSpan(
                  new AlignmentSpan.Standard(Layout.Alignment.ALIGN_NORMAL),
                  0, left.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE
          );
          merged.setSpan(
                  new LineOverlapSpan(),
                  left.length(), left.length() + 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE
          );
          merged.setSpan(
                  new AlignmentSpan.Standard(Layout.Alignment.ALIGN_OPPOSITE),
                  left.length() + 1, left.length() + 1 + right.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE
          );
          view.setText(merged);
      }
      

      LineOverlapSpan 的实现方式如下:

      public class LineOverlapSpan implements LineHeightSpan {
          @Override
          public void chooseHeight(final CharSequence text, final int start, final int end, final int spanstartv, final int v, final Paint.FontMetricsInt fm) {
              fm.bottom += fm.top;
              fm.descent += fm.top;
          }
      }
      

      更多详情请见this answer

      【讨论】:

        【解决方案4】:

        这可能会更好,因为它不允许文本重叠。

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
        
            <TextView
                android:id="@+id/title"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:layout_gravity="start" />
        
            <TextView
                android:id="@+id/sub_title"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1
                android:layout_gravity="end" />
        </LinearLayout>
        

        【讨论】:

          【解决方案5】:

          这绝对适合你...

          <RelativeLayout
              android:layout_width="fill_parent"
              android:layout_height="wrap_content" >
          
              <TextView
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:layout_alignParentLeft="true"
                  android:layout_centerVertical="true"
                  android:layout_marginLeft="5dp"
                  android:text="Left Side"
                  android:textSize="15sp"
                  android:textStyle="bold" />
          
              <TextView
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:layout_alignParentRight="true"
                  android:layout_centerVertical="true"
                  android:layout_marginRight="5dp"
                  android:text="Right Side"
                  android:textSize="15sp"
                  android:textStyle="bold" />
          </RelativeLayout>
          

          【讨论】:

            【解决方案6】:

            这是我发现的最简单的方法。诀窍是在第二个文本视图上使用match_parent,这样它会占用剩余空间并允许gravity 属性将文本移动到末尾。

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent">
            
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Left Aligned" />
            
                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:gravity="end"
                    android:text="Right Aligned" />
            </LinearLayout>
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-02-16
              • 1970-01-01
              • 1970-01-01
              • 2014-12-12
              • 2014-03-15
              • 1970-01-01
              • 2012-01-27
              相关资源
              最近更新 更多