1. 程式人生 > >在程式碼中設定leftMargin和rightMargin值

在程式碼中設定leftMargin和rightMargin值

佈局檔案片段如下:
<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();
    }
}