1. 程式人生 > >Android相容性問題 -- FrameLayout中View設定margin無效

Android相容性問題 -- FrameLayout中View設定margin無效

FrameLayout 中設定margin無效問題

眾所周知,Android在對介面進行佈局時,可以通過設定View的上下左右四個方向的margin值來調整該View和其他View之間的距離。
在佈局檔案中設定margin值的方法如下。

<FrameLayout 
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width
="10dp" android:layout_height="10dp" android:layout_marginTop="10dp" android:layout_marginLeft="10dp" android:src="@android:color/black" />
</FrameLayout>

margin值的設定除了可以在xml中直接配置外,還可以在程式碼中通過LayoutParams來設定。示例程式碼如下。

 ImageView v = (ImageView)findViewById(R.id.imageView
1); ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams)v.getLayoutParams(); params.leftMargin = 20; params.topMargin = 20;

上述程式碼非常簡單,獲取到Imageview的LayoutParams後,將其leftMargin和topMargin設定為20畫素。
上述程式碼正常顯示的效果應該是這樣的。
這裡寫圖片描述
但實際測試發現在某些情況下顯示的效果是這樣的。也就是設定的margin值沒有任何效果。
這裡寫圖片描述

問題原因及解決方法

此問題原因是Android4.0及以下版本中,FrameLayout實現上的一個bug。
如果系統是Android4.0或以下版本,View所在的佈局是FrameLayout,如果在佈局檔案和程式碼中都沒有設定Gravity,則設定的margin值會被忽略。
解決起來也很簡單,就是在佈局檔案或程式碼中增加對Gravity的設定,Gravity可以設定為Gravity.TOP,Gravity.LEFT,甚至可以是Gravity.NO_GRAVITY。程式碼中設定的示例如下。

 ImageView v = (ImageView)findViewById(R.id.imageView1);
 ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams)v.getLayoutParams();
 params.leftMargin = 20;
 params.topMargin = 20;
 params.gravity = Gravity.NO_GRAVITY;

此外,似乎只在FrameLayout中有這個bug,如果是LinearLayout或RelativeLayout,不設定Gravity,margin也會生效。