Android相容性問題 -- FrameLayout中View設定margin無效
阿新 • • 發佈:2019-01-26
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也會生效。