一. 认识 View.OnClickListener

1. 当前所在类实现接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//设置监听者是当前类的对象,当前类的对象需要实现View.OnClickListener接口
class MainActivity : AppCompatActivity(), View.OnClickListener{
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

//设置监听对象View.OnClickListener接口中的方法
btn.setOnClickListener(this)
}

//监听对象实现
override fun onClick(v: View?) {
btn.text = "你好"
}
}

2. 创建一个新类实现接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class MainActivity : AppCompatActivity(){
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

//传入创建的实现类
btn.setOnClickListener(Temp())
}

//创建一个实现View.OnClickListener接口的类
class Temp: View.OnClickListener{
override fun onClick(v: View?) {
v as TextView
v.text = "你好"
}
}

}

3. 创建匿名类实现接口

1
2
3
4
5
6
7
8
9
10
11
12
13
class MainActivity : AppCompatActivity(){
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

//使用匿名类的方式
btn.setOnClickListener(object: View.OnClickListener {
override fun onClick(v: View?) {
btn.text = "你好"
}
})
}
}

匿名类的改造

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//Lambda表达式,接口中只有一个重写的方法时
btn.setOnClickListener({view: View -> Unit
btn.text = "你好"
})

//接口重写的方法的返回值为Unit,返回值可以省略
btn.setOnClickListener({view: View ->
btn.text = "你好"
})

//接口作为最后一个参数时,可以放在外边
btn.setOnClickListener(){view: View ->
btn.text = "你好"
}

//只有接口做为参数时,调用的方法的()可以省略
btn.setOnClickListener{view: View ->
btn.text = "你好"
}

//接口重写的方法只有一个参数时,参数可以省略
btn.setOnClickListener{
btn.text = "你好"
}

补充知识:

1
2
//从当前的Activity跳转到SecondActivity
startActivity(Intent(this,SecondActivity::class.java))

二. 认识 横竖屏

1. 设置Activity的横竖屏状态

AndroidManifest.xml文件中找到所要设置的Activity的标签,标签中社会组screenOrientation的值即可。

  • landscape:强制横屏
  • portrait:强制竖屏
  • user:用户当前的首选方向
  • behind:与在活动堆栈下的活相同方向
  • sensor:根据物理方向传感器确定方向,取决于用户手持的方向
  • nosensor:忽略传感器,即关闭重力感应,跟随系统确定其横屏还是竖屏

2. 设置对应状态的布局文件

默认的布局文件是竖屏状态下显示。

添加layout-land文件夹,存放和layout文件夹中相同的文件名,横屏状态下即会加载对应的文件。

三. 认识also,apply,with,run

Java风格的书写方式

1
2
3
val animator = ObjectAnimator.ofFloat(btn, "rotation", 0f, 360f)
animator.duration = 1000
animator.start()

1. also

改写成also的方式

1
2
3
4
ObjectAnimator.ofFloat(btn, "rotation", 0f, 360f).also { 
it.duration = 1000
it.start()
}

also的原理

1
2
3
4
5
6
7
8
9
@kotlin.internal.InlineOnly
@SinceKotlin("1.1")
public inline fun <T> T.also(block: (T) -> Unit): T {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
block(this)
return this
}

2. apply

改写成apply的方式

1
2
3
4
ObjectAnimator.ofFloat(btn, "rotation", 0f, 360f).apply {
duration = 1000
start()
}

apply的原理

1
2
3
4
5
6
7
8
9
@kotlin.internal.InlineOnly
public inline fun <T> T.apply(block: T.() -> Unit): T {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
block()
return this
}

3. with和run

以后再谈

四. 国际化

找到String.xml文件,点击open editor,点击图标添加一门语言。

设置文本的默认值和对应语言的值,可以选择是否翻译。

查看对应的效果需要在手机中将语言改为对应的语言。