在程式碼中設定leftMargin和rightMargin值
阿新 • • 發佈:2019-02-04
佈局檔案片段如下:
<LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" ...> <GridView android:id="@+id/icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="@val/l_margin" android:layout_marginRight="@val/r_margin" .../> ... </LinearLayout>
現在有需求在程式碼中控制GridView的左右邊距,
隨著GridView中item個數變化,調整leftMargin和rightMargin的值,
查閱手冊後,有兩種方式實現比較方便,具體的實驗程式碼片段如下:
public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); LinearLayout root = (LinearLayout) findViewById(R.id.root); //output screen size information in Logs DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); int width = dm.widthPixels; int height = dm.heightPixels; Log.d("Screen Info", "width:" + width + ", height:" + height); //left/right margin test (Method --- 01) GridView gv = (GridView)findViewById(R.id.testID); LinearLayout.LayoutParams paramTest = (LinearLayout.LayoutParams) gv.getLayoutParams(); paramTest.leftMargin = 50; paramTest.rightMargin = 50; gv.setLayoutParams(paramTest); Log.d("Screen Info", "LeftMargin:" + paramTest.leftMargin + ", RightMargin:" + paramTest.rightMargin); }
上面程式碼片段實現了在程式碼中設定Margin值的第一種方式,需要說明的是,這裡要根據不同佈局配置來做轉換,
比如這裡GridView是在LinearLayout佈局內,所以轉換為:LinearLayout.LayoutParams
另外,leftMargin和rightMargin分別是LinearLayout.LayoutParams的成員。
//left/right margin test (Method --- 02) GridView gv = (GridView)findViewById(R.id.testID); ViewGroup.MarginLayoutParams paramTest2 = (ViewGroup.MarginLayoutParams) gv.getLayoutParams(); paramTest2.setMargins(30, 0, 30, 0); gv.requestLayout(); //... ...
上面程式碼片段是實現該功能的第二種方式,需要說明的是,
這裡不再依賴不同的佈局檔案和根據不同佈局做轉換的問題,但是元件本身要支援margins的方法才可行
比如下面這個例子:
public static void setMargins (View v, int l, int t, int r, int b) {
if (v.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) v.getLayoutParams();
p.setMargins(l, t, r, b);
v.requestLayout();
}
}