2013-08-21 89 views
2

正如我的標題描述,我想在一個TextView文本在其水平居中的父元素,同時保持文本左對齊:Android的中心TextView的水平,同時保持左對齊

所以這樣的:

|  Text  | 
| TextText | 

變成這樣:

| Text  | 
| TextText | 

這可能與Android?

這是我目前的佈局:

<TextView 
    android:layout_width="0dp" 
    android:layout_height="match_parent" 
    android:layout_weight="0.25" 
    android:background="@drawable/table_cell" 
    android:gravity="center" 
    android:text="@string/table_last_training" /> 

由於提前, 麥克法蘭

+0

您可能需要創建一個自定義的視圖類和處理中的onDraw TextView的繪圖參數,據一個我知道它正在改變根據屏幕的這樣做,因爲你將不得不處理的唯一途徑/佈局尺寸僅在onMeasure之後確定。這是除非你真的想一起破解它,在這種情況下,你可以創建一個方法,根據需要添加空格作爲填充。如果你願意,我可以回答你如何做黑客攻擊(儘管我不會推薦它):P)。也有幾種方法可以使用純XML來做到這一點,但我發現它變得混亂。 – zgc7009

回答

0

此佈局更新了答案。

|文字| | TextText |

我將layout_height更改爲wrap_content。也添加在TableRow裏面。 我個人不喜歡TableLayout,因爲它是不可預知和麻煩的,特別是在使用合併列colspan時。 我更喜歡在每行使用帶有layout_weight的LinearLayout。

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:layout_width="match_parent" 

     android:orientation="vertical" 
     android:padding="10dp" > 

     <TableLayout 
      android:id="@+id/tableLayout1" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:background="@drawable/table_shape" > 

      <TableRow 
       android:layout_width="wrap_content" 
       android:layout_height="fill_parent" 
       android:background="@drawable/cell_shape3" 
       android:padding="10dp" > 

       <LinearLayout 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:layout_weight="1" 
        android:orientation="horizontal" > 

        <View 
         android:layout_width="0dp" 
         android:layout_height="wrap_content" 
         android:layout_weight="0.375" /> 

        <TextView 
         android:layout_width="0dp" 
         android:layout_height="wrap_content" 
         android:layout_weight="0.25" 
         android:text="Text" /> 

        <View 
         android:layout_width="0dp" 
         android:layout_height="wrap_content" 
         android:layout_weight="0.375" /> 
       </LinearLayout> 
      </TableRow> 

      <TableRow 
       android:layout_width="wrap_content" 
       android:layout_height="fill_parent" 
       android:background="@drawable/cell_shape3" 
       android:padding="10dp" > 

       <LinearLayout 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:layout_weight="1" 
        android:orientation="horizontal" > 

        <View 
         android:layout_width="0dp" 
         android:layout_height="wrap_content" 
         android:layout_weight="0.375" /> 

        <TextView 
         android:layout_width="0dp" 
         android:layout_height="wrap_content" 
         android:layout_weight="0.25" 
         android:text="Text Text" /> 

        <View 
         android:layout_width="0dp" 
         android:layout_height="wrap_content" 
         android:layout_weight="0.375" /> 
       </LinearLayout> 
      </TableRow> 
     </TableLayout> 

    </ScrollView> 
+0

我的父母單元格是一個TableRow。 我試過你的解決方案1,因爲TableRow擴展了線性佈局,但它不起作用。第一,它突然填滿整個垂直屏幕高度,第二,它不是水平居中。 「虛擬視圖」只是作爲TextView的邊距。 我也嘗試用TableView中的RelativeView來包裝TextView,但是你的解決方案不會在這種情況下集中任何東西。 – McFarlane

+0

我用TableRow更新了答案。請檢查 – duchuy

+0

感謝您的回覆。我已經試過了。問題是,那些空白視圖的行爲就像是文本視圖的37.5%填充。這導致TextView不會實際以其內容爲中心。 – McFarlane

0
private String hackSpace(Context context, float textSize, String text) { 
    TextView textView = new TextView(context); 
    textView.setTextSize(textSize); 
    ViewGroup.LayoutParams textViewParams = new ViewGroup.LayoutParams(WRAP_CONTENT, WRAP_CONTENT); 
    textView.setLayoutParams(textViewParams); 
    String[] sentences = text.split("\n"); 
    //calculate space width 
    textView.setText(" "); 
    textView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); 
    int slice = textView.getMeasuredWidth(); 
    //calculate each sentence 
    int[] sentencesWidth = new int[sentences.length]; 
    //store max width 
    int maxWidth = 0; 
    for (int i = 0; i < sentences.length; i++) { 
     textView.setText(sentences[i]); 
     textView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); 
     sentencesWidth[i] = textView.getMeasuredWidth(); 
     if (sentencesWidth[i] > maxWidth) { 
      maxWidth = sentencesWidth[i]; 
     } 
    } 
    //add space after each sentence if necessary 
    for (int i = 0; i < sentences.length; i++) { 
     int spaceNum = (maxWidth - sentencesWidth[i])/slice; 
     StringBuilder sb = new StringBuilder(); 
     for (int k = 0; k < spaceNum; k++) { 
      sb.append(" "); 
     } 
     sentences[i] += sb.toString(); 
    } 
    //rebuild String 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < sentences.length; i++) { 
     sb.append(sentences[i]); 
     if (i != sentences.length - 1) { 
      sb.append("\n"); 
     } 
    } 
    return sb.toString(); 
} 
+0

只需使用hackSpace(Context,float,String)在將句子設置爲TextView之前在句子中添加空格。 – afunx