1. 程式人生 > >Android TextView 單行時要求靠右對齊,第二行要左對齊

Android TextView 單行時要求靠右對齊,第二行要左對齊

需求

效果見圖:
單行時文字靠右顯示
多行時要求第二行靠左顯示

過程

要求圖片靠右對其,採用RelativeLayout

<RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="#cccccc"
        android:gravity="center_vertical">

        <ImageView
            android:id="@+id/iv_icon"
            android:layout_width
="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_marginBottom="5dp" android:layout_marginTop="5dp" android:src="@mipmap/ic_launcher"/>
<TextView android:id="@+id/tv_left"
android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:layout_centerVertical="true" android:text="測試測試"/>
<TextView android:layout_width="wrap_content" android:layout_height
="match_parent" android:layout_toLeftOf="@id/iv_icon" android:layout_toRightOf="@id/tv_left" android:gravity="center_vertical|right" android:text="ssssssssssssssssss"/>
</RelativeLayout>

結果不理想,第二行會同樣靠右對齊,很醜,,
想了想,應該可以通過採用wrap_content,然後用layout_gravity靠右,gravity靠左的方法實現,but雖然TextView寬度採用的是wrap_content,但是因為父佈局是RelativeLayout,所以採用下面這兩個屬性的時候寬度會自動變撐滿這倆中間的部分,
android:layout_toLeftOf=”@id/iv_icon”
android:layout_toRightOf=”@id/tv_left”
而且重點是在相對佈局中沒有layout_gravity的屬性,所以這個想法夭折了。。

然後和人討論,有人提出新增監聽,在文字改變後用 mTextView.getLineCount();獲取行數,如果大於兩行,再改變gravity為靠右顯示

 if(mTextView.getText()!=null){
            int lines = mTextView.getLineCount();
            System.out.println("LoginActivity.initView-----------linecount"+lines);
            if (lines > 1) {
                mTextView.setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL);
            }
        }

這裡個有問題,因為是TextView,如果是兩行,在佈局初始化展示的時候就需要有需求效果,沒法通過新增TextWatcher來判斷。
如果將上述程式碼放到初始化佈局的時候,mTextView.getLineCount();這個方法會返回0,看了下注釋,是這個:
Return the number of lines of text, or 0 if the internal Layout has not been built.因為佈局還沒有建立,我又把上述程式碼放到onResume裡,還是不行,返回依然是0

解決方案

最後就只能取個巧,因為左側的控制元件我是已知其長度的,就按如下的程式碼:
不加android:layout_toRightOf=”@id/tv_left”這個屬性了,這樣就可以保證TextView的寬度是wrap_content,
然後只採用android:layout_toLeftOf=”@id/iv_icon”來讓控制元件靠右,通過android:layout_marginLeft=”70dp”來保證不會覆蓋住左側的控制元件,,,,,,就這樣,,

<RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="#cccccc"
        android:gravity="center_vertical">

        <ImageView
            android:id="@+id/iv_icon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_marginBottom="5dp"
            android:layout_marginTop="5dp"
            android:src="@mipmap/ic_launcher"/>

        <TextView
            android:id="@+id/tv_left"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:layout_centerVertical="true"
            android:text="測試測試"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_marginLeft="70dp"
            android:layout_toLeftOf="@id/iv_icon"
            android:gravity="center_vertical"
            android:text="ssssssssssssssssssss"/>
    </RelativeLayout>

finally

雖然有些地方不試用,但感覺這樣的展示介面,大部分都是可以確定左側或右側最少有一個是固定長度的,這樣就可以用了。