2011-09-30 52 views
0

我目前正在開發一個以重量爲特徵的組件。這些組件包含文本和圖標。據我所知,android不提供根據其父視圖縮放文本的功能。因此,我需要測量這些視圖,然後手動將自定義字體應用於TextView並設置適當的字體大小。我經常得到09-30 17:55:14.844:ERROR/ViewRoot(12893):OutOfResourcesException鎖定表面 )錯誤,我相信這可能會被連接到我做我的佈局的方式。Android佈局:測量視圖以選擇正確的TextView字體大小

這是在佈局一行(有幾行)

<RelativeLayout 
    android:layout_height="0dip" 
    android:layout_width="fill_parent" 
    android:layout_weight="0.35" 
    android:id="@+id/activity_main_row_1"> 
    <View 
     android:layout_width="6dip" 
     android:layout_height="fill_parent" 
     android:background="@color/palette_green" 
     android:layout_alignParentLeft="true" 
    /> 
    <RelativeLayout 
     android:layout_centerVertical="true" 
     android:layout_height="wrap_content" 
     android:layout_width="fill_parent" 
     android:paddingLeft="20dip"> 
     <TextView 
      android:id="@+id/activity_main_row_1_title" 
      android:text="@string/title_add_expense" 
      android:textSize="10dip" 
      android:textColor="@color/palette_grey" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentTop="true" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_margin="0px"> 
     </TextView> 
     <TextView 
      android:id="@+id/activity_main_row_1_sub_title" 
      android:text="@string/subtitle_add_expense" 
      android:textSize="10dip" 
      android:textColor="@color/palette_dark_grey" 
      android:layout_alignParentLeft="true" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_margin="0px" 
      android:layout_below="@+id/activity_main_row_1_title"> 
     </TextView> 
    </RelativeLayout> 
    <ImageView 
     android:id="@+id/activity_main_row_1_bracket" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/icon_bracket_right_grey" 
     android:paddingLeft="0dip" 
     android:paddingRight="0dip" 
     android:paddingTop="24dip" 
     android:paddingBottom="20dip" 
     android:layout_alignParentRight="true"> 
    </ImageView> 

</RelativeLayout> 

這是我的方式做測量:

中的onCreate:

LinearLayout mLayout = (LinearLayout) this.getLayoutInflater().inflate(R.layout.activity_main, null); 
    mLayout.getViewTreeObserver().addOnGlobalLayoutListener(this); 
    this.setContentView(mLayout); 

在onGlobalLayout:

@Override 
public void onGlobalLayout() { 

    int mRow1Height = mRow1.getHeight(); 
    <omitted> 


    if(mRow1Height>0) { 
     TextView row1Title = (TextView) findViewById(R.id.activity_main_row_1_title); 
     row1Title.setTypeface(mFontProvider.getTypeface()); 
     row1Title.setTextSize((float) ((mRow1Height)*.3)); 

     TextView row1SubTitle = (TextView) findViewById(R.id.activity_main_row_1_sub_title); 
     row1SubTitle.setTypeface(mFontProvider.getTypeface()); 
     row1SubTitle.setTextSize((float) ((mRow1Height)*.2)); 
    } 

這是做我想做的事的正確方法嗎?

非常感謝您的建議。

乾杯

回答

1

我發現,是造成OutOfResourcesExceptions問題。在onLayout中,我設置了TextView的文本。這會導致視圖重新佈局,導致一種無限循環。

但是,我仍然有興趣知道使用addOnGlobalLayoutListener和onLayout是縮放TextView的動態大小父視圖的唯一方法。