- gravity和layout_gravity的区别
android:gravity 属性是对该view中内容的限定. android:layout_gravity是用来设置该view相对与父view 的位置.
- 在代码中如何设置
android:gravity 对应的是 setGravity()
android:layout_gravity 对应的是 LayoutParam.gravity The gravity to apply with the View to which these layout parameters
* are associated. 也就是属于 LayoutParam的作用区域(对父view)
实例:
public class TestViewActivity extends AppCompatActivity {
@Override
protected void onCreate( @Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState) ;
LinearLayout picContainer= new LinearLayout( this) ;
picContainer.setLayoutParams( new ViewGroup.LayoutParams(ViewGroup.LayoutParams. MATCH_PARENT , DPIUtil. getWidthByDesignValue720( 236))) ;
picContainer.setBackgroundColor(Color. parseColor( "#ffffff")) ;
addView(picContainer) ;
setContentView(picContainer) ;
}
private void addView(LinearLayout picContainer){
for ( int i= 0 ;i< 3 ;++i){
LinearLayout.LayoutParams picOuterParams= new LinearLayout.LayoutParams(DPIUtil. getWidthByDesignValue720( 236) ,DPIUtil. getWidthByDesignValue720( 236)) ;
FrameLayout.LayoutParams picParams= new FrameLayout.LayoutParams(DPIUtil. getWidthByDesignValue720( 210) ,DPIUtil. getWidthByDesignValue720( 210)) ;
picParams. gravity= Gravity. CENTER ; //设置图片居中
FrameLayout picOuter= new FrameLayout( this) ;
picOuter.setBackgroundColor(Color. parseColor( "#00ff00")) ; //for test
if ( 0==i){
picOuterParams. leftMargin=DPIUtil. getWidthByDesignValue720( 0) ;
} else {
picOuterParams. leftMargin=DPIUtil. getWidthByDesignValue720( 6) ;
}
// picOuter.setLayoutParams(picOuterParams);
ImageView picView= new ImageView( this) ;
// picView.setLayoutParams(picParams);
picView.setImageResource(R.mipmap. pic0) ;
picView.setScaleType(ImageView.ScaleType. CENTER) ;
picOuter.addView(picView ,picParams) ;
picContainer.addView(picOuter ,picOuterParams) ;
}
}
}
注意:易错点 错误使用引用 picOuterParams 在第一个和其他商品图片处 值是不同的 第一个的左margin为0,其他的左margin为6; 此时 picOuterParams 必须写在循环体里面,否则效果如下:
private void addView(LinearLayout picContainer){
//移到循环体外面,是一个引用,所以会被后面赋值覆盖
LinearLayout.LayoutParams picOuterParams= new LinearLayout.LayoutParams(DPIUtil. getWidthByDesignValue720( 236) ,DPIUtil. getWidthByDesignValue720( 236)) ;
for ( int i= 0 ;i< 3 ;++i){
FrameLayout.LayoutParams picParams= new FrameLayout.LayoutParams(DPIUtil. getWidthByDesignValue720( 210) ,DPIUtil. getWidthByDesignValue720( 210)) ;
picParams. gravity= Gravity. CENTER ;
FrameLayout picOuter= new FrameLayout( this) ;
picOuter.setBackgroundColor(Color. parseColor( "#00ff00")) ;
if ( 0==i){
picOuterParams. leftMargin=DPIUtil. getWidthByDesignValue720( 0) ; //被覆盖了
} else {
picOuterParams. leftMargin=DPIUtil. getWidthByDesignValue720( 6) ;
}
ImageView picView= new ImageView( this) ;
picView.setImageResource(R.mipmap. pic0) ;
picView.setScaleType(ImageView.ScaleType. CENTER) ;
picOuter.addView(picView ,picParams) ;
picContainer.addView(picOuter ,picOuterParams) ;
}
}
效果:
可见第一项的左边也是6的边距(代码里不是设置0了吗),原因在于param用的是一个引用! 第一个商品的被后续的覆盖了。。