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.imageView1); 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也会生效。

参考:
1. http://stackoverflow.com/questions/5401952/framelayout-margin-not-working

更多相关文章

  1. mybatisplus的坑 insert标签insert into select无参数问题的解决
  2. Android界面编程——Android基本控件
  3. Android各版本代号和API级别对照表
  4. android使用webview上传文件(支持相册和拍照)
  5. [Android(安卓)GMS 认证] CTS 问题列表之 CtsOsTestCases
  6. CheckBox 设置style 没有效果的原因
  7. android 简单拨号器 代码
  8. Android(安卓)Fragment 问题汇总
  9. Android(安卓)获取无线蓝牙MAC信息代码

随机推荐

  1. android通过shape.xml制作渐变背景
  2. android中各种颜色在drawable.xml的值
  3. Android动态壁纸开发
  4. Android(安卓)开发笔记 - Android(安卓)S
  5. Android弹窗
  6. Android(安卓)SDK,API版本对照
  7. Android:简单联网获取网页代码
  8. 组件居中显示 安卓
  9. Android开发问题记录——“The connectio
  10. 第一行代码笔记之——Activity启动模式