Android一種常見的佈局困擾

24K純帥豆發表於2019-02-14

序言:步入社會之後有很多東西都變得身不由己了,比如說加班,放假之前的一個禮拜都處於加班的狀態,加班歸加班,但是問題還是得要記錄一下的,話不多說,直接上圖:

圖一
圖二

相信大多數人都遇到過這樣的需求,一個Item中的標題後面跟了一個標籤,最多隻能顯示一行,而標籤是首先需要展示的,也就是說標籤必須展示完全,然後標題儘可能多的展示文字,一行不夠的話就用...來代替。好了,讓我們來分析一下:

**錯解:**這裡特別說明一下,很多人就覺得直接讓標籤居右邊顯示然後標題在標籤的左邊佔有剩下的佈局就好了,當標題和標籤的文字很短時,這樣就不能讓文字相互挨著了,所以這樣做顯然是行不通的;還有的人可能會覺得,用線性佈局,標籤自適應,標題設定權重就好了,這樣做有可能的後果同上,當標題文字很短時,兩邊文字也不能相互挨著了,最後相信大部分人都會選擇讓UI去屎吧,設計的啥X玩意兒,但是人設計師會說IOS都實現了,你們Android應該也能實現的啊!WTF!!!罵過之後還是得乖乖的把它給實現,這就是程式猿的命啊!

**正解:**抱怨完之後,我們們來想想有沒有啥解決辦法,首先我想到的是動態的給標題設定空間,先讓標籤佈局好,然後計算掉標籤所花費的空間,還有其他一些邊距神馬的,再計算螢幕的寬度,然後減去標籤以及邊距所佔的空間,剩下的就是標題的空間了。那我們又是如何計算文字寬度的呢?

獲取文字寬度方法:

TextPaint textPaintTitle=tvTitle.getPaint();
//title是textview所展示的文字
int textTitleWidth = (int) textPaintTitle.measureText(title);
複製程式碼

這樣就可以獲取textview的寬度了:

private void setText() {
    tvTitle.setText(title);
    tvLabel.setText(label);

    textPaintTitle = tvTitle.getPaint();
    textPaintLabel = tvLabel.getPaint();
    int screenWidth = ScreenUtil.getScreenWidth(this);
    int textTitleWidth = (int) textPaintTitle.measureText(title);
    int textLabelWidth = (int) textPaintLabel.measureText(label);
    //這60dp是textview的一些邊距神馬的,具體可以去佈局檔案中計算
    int totalLeaveWidth = screenWidth - textLabelWidth - ScreenUtil.dp2px(this, 60.0f);

    if (textTitleWidth > totalLeaveWidth) {
        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) tvTitle.getLayoutParams();
        params.width = totalLeaveWidth;
    }
}
複製程式碼

這樣就可以解決上述的問題了:

最終效果圖

公眾號:Android技術經驗分享

相關文章