布局文件片段如下:
- <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();
- }
- }