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