1. 程式人生 > >關於Android設定控制元件margin無效的解決辦法

關於Android設定控制元件margin無效的解決辦法

一、需求

右上角跳過按鈕距離狀態列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的值進行定義的時候,會隨定義的內容生效