1. 程式人生 > >android 為何設定view為wrap_content但是實際佈局大小為match_parent

android 為何設定view為wrap_content但是實際佈局大小為match_parent

描述

當我們在設定view的寬高的時候,有時候我們明明設定的是wrap_content,但是卻得到了match_parent的效果,特別是我們自定義view的時候,經常碰到這種情況。之前都覺得很神奇,後邊慢慢看view的繪製流程以及看原始碼總算是弄明白原因了。

總的來說是在view.measure方法裡呼叫了onMeasure方法,然後onMeasure方法又呼叫了setMeasureDimension方法,
此時setMeasureDimension方法傳入的引數是通過getDefaultSize方法獲取到的精確的尺寸大小,而getDefaultSize(size,measureSpec)
傳入的引數size是getSuggestedMinimumWidth的返回值大小(如果背景寬度為null則返回minWidth,不為null則獲取max(mBackground.getMiniwidth,minWidth)中一個比較大的值
傳入的引數measureSpec為child.measure(widthSpec,heightSpec)的引數
getDefaultSize的具體實現是

int result = size;
  int specMode = MeasureSpec.getMode(measureSpec);
  int specSize = MeasureSpec.getSize(measureSpec);
  switch(specMode){
     case MeasureSpec.UNSPECIFIED:
         result = size;
         break;
      case MeasureSpec.AT_MOST:
      case MeasureSpec.EXACTLY:
         result = specSize;
         break
; }

會發現當我們設定view或者viewgroup的寬高為wrap_content的時候,預設就是match_parent的效果
原因就在getDefaultSize裡google工程師預設的把AT_MOST和EXACTLY做相同的處理了。

解決

那麼如何解決view的wrap_content的情況呢?直接呼叫setMeasureDimension()傳入一個預設的size
那麼如何解決viewGroup的wrap_content的情況呢?預設的viewGroup的measure方法裡有一句super.onMeasure(WidthMeasureSpec,heightMeasureSpec);
這時候我們需要在super之前人為的重新生成一個measureSpec,替換viewGroup原來的measureSpec
那麼如何生成一個measureSpec呢?
通過MeasureSpec.makeMeasureSpec(size,mode)來生成,聰明的你肯定
會問那麼這裡傳入的size和mode值是多少呢?
如果說我們想要獲取當前view的wrap_content大小,則通過MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED)來生成。

相關推薦

android 為何設定viewwrap_content但是實際佈局大小match_parent

描述 當我們在設定view的寬高的時候,有時候我們明明設定的是wrap_content,但是卻得到了match_parent的效果,特別是我們自定義view的時候,經常碰到這種情況。之前都覺得很神奇,後邊慢慢看view的繪製流程以及看原始碼總算是弄明白原

php empty 函式判斷結果實際值卻非空的原因解析

最近我在一個專案中使用 empty 時獲取到了一些意料之外的結果。下面是我處理後的除錯記錄,在這裡與你分享了。 var_dump( $user->uid, empty($user->uid) ); 它的結果是: string(5) "2955" bool(true)

android-自定義View解決wrap_content無效的問題

###問題提出 在我們自定義view時,如何需要是當前的view內容自適應,這種平常的使用中,只需要在xml檔案中制定寬高或者長高為wrap_content即可,但是如果該view是我們自定義的,那麼此時再在xml檔案中指定寬高為wrap_content則不能起到內容自適

Android——動態設定view背景顏色setBackgroundColor

setBackgroundColor 用於動態設定view背景顏色 今天寫程式碼的時候遇到個小問題 動態設定的時候用Color.GRAY,系統自己帶著的顏色,是沒有問題的 但是用自己定義的顏色,就不生效。 然後我搜索到了下面這個網址 請瀏覽上

Android 動態設定View的id——setId

問題 動態給自定義view設定id,有時候會報錯,下面我將帶頭衝鋒(德邦跑錯場了。。。。) AndroidStudio會報錯: 因為在sdk17(4.2.2)以上可以使用myView.setId(View.generateViewId())才行,為了相

android設定View字型點選變色和邊框背景設定

1.設定字型變色 selector_orange_white.xml <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/a

scrollview設定view的可見性導致佈局錯誤

今天遇到一個很奇怪的問題,我為了專案的頁面可以滾動加入了ScrollView 可是我專案需求是點選按鈕後需要設定一些view的可見性為gone,然後另一個佈局由不可見到可見 但是發現改變後佈局錯誤而且是一個view不可見了 一開始還以為是fragment的問題,但後來

Android進階UI之ImageView設定長度高度wrap_content時高度根據圖片比例自適應

1 示例 <ImageView android:id="@+id/img_1" android:layout_width="fill_parent" android:layout_height="wrap_cont

android】解決Viewpager設定高度wrap_content無效的方法

今天發現設定viewpager高度為wrap_content時並沒作用,stackoverflow給出瞭解決方案,就是自定義viewpager,重寫onMesure()方法: public class WrapContentHeightViewPager extends

Android的RelativeLayout的layout_height屬性設定wrap_content時layout_below等無效

RT RelativeLayout中,如果將 TextView的 android:layout_height=”wrap_content” android:layout_centerVertical=”true” 之後,其他的控制元件的android:l

SQL Server 檢測到基於一致性的邏輯 I/O 錯誤 pageid 不正確(應 1:1772,實際 0:0)。在文件 'D:Program FilesMicrosoft SQL Ser

red 完成 sdn blank net tools ocl views 偏移 SQL Server 檢測到基於一致性的邏輯 I/O 錯誤 pageid 不正確(應為 1:1772,但實際為 0:0)。在文件 ‘D:\Program Files\Microsoft S

解決:彩信,加入了有效聯系人和編輯了主題,按返回鍵,提示信息存草稿,實際未儲存

應該 andro com ogl con trac 結果 launch 文件 【預置條件】新建彩信加入有效聯系人及主題 【測試步驟】新建彩信加入有效聯系人及主題。按返回鍵 【測試結果】提示信息已存為草稿,實際未儲存 【預期結果】正常存為草稿 分析: 該Bu

什麽pymysql執行SQL語句提示成功實際並沒有操作數據庫?

PyQt5 Python pymysql 開發環境:Anaconda3+PyCharm2018問題:使用pymysql插入數據提示成功,連接數據庫發現並沒有數據。原因:pymysql在連接數據庫的時候會有一個參數autocommit默認為False,表示執行完SQL語句後是否自動提交到真正的數據庫

android 開發 將view保存image的實現及將html保存pdf格式

開發 eight red media try todo file per text 一、將view保存為image public class ImageHelper {   ///將view保存到bitmap中 public Bitmap createBitm

android -- EditText 設定 imeOptions 屬性為何失效?

前言 最近改 bug 的時候碰到一個小知識點,在搜尋介面希望鍵盤上的 enter 鍵改為搜尋按鈕。也就是下圖的效果,是不是非常常見。 然後我就記得 Editext 有個 imeOptions 的屬性,可以設定 enter 鍵的效果。所以果斷在 xml 中寫下 android:imeOpt

Android View/ViewRoot洩漏Activity不洩漏問題

一般android裡的記憶體洩漏都是activity洩漏,測試方法通常是在back回到桌面的時候,檢視其activity,view例項物件是否為0來判斷,activity洩漏一般比較好定位,方法網上文章也有很多,都是通過檢視acitivity物件的gcroot路

Android 控制元件view的可見,不可見,隱藏的設定visibility

可見(visible) XML檔案:android:visibility="visible" Java程式碼:view.setVisibility(View.VISIBLE);   不可見(invisible) XML檔案:android:visibility="inv

Android Glide設定預設圖片、異常圖片圓形圖片

Android Glide4 非同步圖片框架 前言: 在專案開發中,是需要經常用到圓形圖片的,設定預設圖片,設定資源圖片等等。 若是,異常圖片,預設圖片都需要美工妹子做成圓形圖片,無疑增加了美工妹子的工作量。本著當活雷鋒的思想,程式設計師能搞定的事

Android EditText設定單行

在EditText設定單行,由於android:single屬性顯示過時,提示用使用android:maxLines=”1”代替,但是設定之後沒有任何效果。這是由於android:inputType屬性預設值為none的緣故.只要將android:inputTy

GridView 設定其高度屬性 wrap_content

如果把GridView放到一個垂直方向滾動的佈局中,設定其高度屬性為 wrap_content ,則該GridView的高度只有一行內容,其他內容通過滾動來顯示。 如果你想讓該GridView的高度為所有行內容所佔用的實際高度,則可以通過覆寫GridView的 onM