關於Android設定控制元件margin無效的解決辦法
阿新 • • 發佈:2019-01-06
一、需求
右上角跳過按鈕距離狀態列50px以及距離右邊50px,相對位置如圖。
二、獲取狀態列高度
圖片中黑色部分需要頂上狀態列,那麼設定Button的margin值時,就應該把狀態列的高度考慮進去,這簡單
int resourceId = context.getResources().getIdentifier("status_bar_height",
"dimen",
"android" );
int statusBarHeight = context.getResources().getDimensionPixelSize(resourceId);
三、設定margin值
//設定按鈕偏移位置(相對於狀態列的top)
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)mBtnSkip.getLayoutParams();
params.setMargins(0,
statusBarHeight + 50,
50 ,
0);
mBtnSkip.setLayoutParams(params);
這樣就可以實現了在不同的手機,該跳過按鈕,都距離頂部和右邊都有50px的間距
四、可能會出現的問題
1.java.lang.ClassCastException
如果是LayoutParams的類轉型錯誤,那麼請檢查
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)mBtnSkip.getLayoutParams();
這裡涉及到LayoutParams的知識。
LayoutParams are used by views to tell their parents how they want to be laid out
LayoutParams中儲存的值也就是該控制元件告訴Layout的引數,一旦LayoutParams型別錯誤,自然轉型就會出現問題。這時候檢視Java程式碼中的LayoutsParams和XML佈局中的型別是否一致即可解決。
2.Java程式碼中設定Margin引數無效
當你看到呈現出來的效果和XML佈局中的引數一致的時候,這時候你應該要知道,可能是XML中的引數和Java程式碼中設定的引數產生了覆蓋。
- 當Java程式碼與XML佈局中同時設定Margin的值時,XML佈局的值會覆蓋Java程式碼中設定的值。
其實,這幅圖片呈現的效果只是在XML佈局中宣告的marginTop:50px;marginRight:50px;因為這是相對於狀態列頂部的,所以此處不符合需求。 - 當Java程式碼或XML佈局中只存在一個對Margin的值進行定義的時候,會隨定義的內容生效