1、线性布局LinearLayout
Kotlin中线性布局这个View控件在xml布局文件中的使用方式跟Java中的使用就完全一样,没什么特别注意的地方。但是在kotlin代码中的使用相对于Java就有一些不同:
1、Kotlin允许对属性orientation直接赋值,以取代Java中的setOrientation()方法,类似的还有gravity属性取代了setGravity()方法。
2、 Kotlin使用关键字as进行变量类型的强制转换,比如由View转换为Button:(view as button).***
3、Kotlin支持调用dip方法将数值dip直接转换为px,,倘若由Java编码,那么需要开发者自己实现dip与px的转换工具类。不单单如此,Kotlin还提供了sppx, px→dip,px→sp,dip→sp的转换方法。
布局如下:
<LinearLayout
android:id="@+id/llLinear"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="@color/colorPrimary">
<TextView
android:id="@+id/tvStella"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Stella"
android:padding="5dp"
android:background="@color/buttonSolid"
android:layout_margin="5dp"/>
<TextView
android:id="@+id/tvXiaoYu"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="晓晓"
android:padding="5dp"
android:background="@color/buttonSolid"
android:layout_margin="5dp"/>
</LinearLayout>
Kotlin代码如下:
var count = 0;
fun llLinear(){
llLinear.setOnClickListener {
var mod = count % 2
when(mod){
0->mod0()
else->mod1()
}
count++
}
}
fun mod0(){
llLinear.orientation = LinearLayout.HORIZONTAL
llLinear.gravity = Gravity.LEFT
var params = llLinear.layoutParams as LinearLayout.LayoutParams
params.setMargins(dip(5), dip(5), dip(5), dip(5))
llLinear.layoutParams = params
}
fun mod1(){
llLinear.orientation = LinearLayout.VERTICAL
llLinear.gravity = Gravity.CENTER
var params = llLinear.layoutParams as LinearLayout.LayoutParams
params.setMargins(dip(10), dip(10), dip(10), dip(10))
llLinear.layoutParams = params
}
切换效果如下:
相应的,在通过Kotlin的代码设置LinearLayout的其他的属性的方式跟上面差不多,开发中可以细细体会。
2、相对布局RelativeLayout:
有了上面LinearLayout的使用经历,大致也能猜到RelativeLayout的使用方式的变化。相对布局内部的视图不依赖于排列规则(水平顺序排列、竖直顺序排列),而是依赖于指定的参照物,这参照物可以是与盖世兔平级的视图,也可以是盖世兔的上级视图(即父View);以及指定当前视图位于参照物的方向;二者相辅相成,确定该View的具体位置。
布局如下:
<RelativeLayout
android:id="@+id/rlRelative"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="50dp"
android:background="@drawable/main_button_bg"
android:layout_margin="5dp"
android:padding="5dp">
</RelativeLayout>
代码如下:
var mView = TextView(this)
mView.text = "可爱的晓晓"
mView.width = dip(120)
mView.height = dip(60)
mView.gravity = Gravity.CENTER
mView.setBackgroundResource(R.drawable.rl_view_bg)
rlRelative.addView(mView)
效果图如下:
相对布局RelativeLayout因其在方位上的向定规则较多,因此在去之上就比较丰富,比如RelativeLayout.LEFT_OF表示位于至顶视图的左边,RelativeLayoutALIGN_RIGHT表示与指定视图左侧对其,RelativeLayout.CENTER_IN_PARENT表示位于父视图的中央等等。这些位置的指定都是通过Kotlin提供的addRule()方法添加进去的:
rlRelative.addRule(RelativeLayout.ABOVE, 指定的View视图的资源ID)
rlRelative.addRule(RelativeLayout.ALIGN_PARENT_LEFT, 指定视图的资源ID)
…………
但是上面的代码有点冗长了,因此Kotlin利用Anko库对代码调用方式做了优化,以简化开发者调用方法API的难度:
rlRelative.above(指定的View视图的资源ID)
rlRelative.alignParentLeft()
…………
关于Kotlin的Anko库的依赖,见app的gradl.build以及moudle的gradle.build。Anko库提供的其他简化方法如下:
3、约束布局ConstraintLayout
束布局主要是为了解决传统的线性布局、相对布局等的缺点:多重嵌套,缺乏灵活性,而且嵌套过多导致渲染效率低下。他同事兼顾了灵活性和渲染高效率,是另一种更高级的相对布局。但也存在一个缺点,那就是,控件与控件之间的位置关系都是相互依赖参照的。其中一个控件发生了变化,那么有可能其他的所有控件位置管理立马混乱。
ConstraintLayout布局的几个关于方位控制的参数理解:详见《约束布局ConstraintLayout笔记》