导航条和状态栏
常用功能,其它上网就可以:
//状态栏
implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
在每个ActivityOnCreate方法增加这个就可以
ImmersionBar.with(this)
.transparentBar() // 透明
.hideBar(BarHide.FLAG_HIDE_BAR) // 隐藏状态和导航条
.init()
常用功能,其它上网就可以:
//状态栏
implementation 'com.gyf.immersionbar:immersionbar:3.0.0'
在每个ActivityOnCreate方法增加这个就可以
ImmersionBar.with(this)
.transparentBar() // 透明
.hideBar(BarHide.FLAG_HIDE_BAR) // 隐藏状态和导航条
.init()
先引入库:
implementation 'com.tencent:mmkv-static:1.2.10'
这封装一个类
import android.widget.EditText
import android.widget.TextView
import androidx.annotation.Nullable
import com.tencent.mmkv.MMKV
import kotlinx.android.synthetic.main.activity_login_by_password.*
import java.lang.Exception
/**
* 保存本地数据KEY
*/
object Save {
/**
* 常用保存
*/
fun set(key: String, @Nullable value: Any) {
when (value) {
is String -> MMKV.defaultMMKV().encode(key, value)
is Boolean -> MMKV.defaultMMKV().encode(key, value)
is Long -> MMKV.defaultMMKV().encode(key, value)
is Int -> MMKV.defaultMMKV().encode(key, value)
is Double -> MMKV.defaultMMKV().encode(key, value)
is Float -> MMKV.defaultMMKV().encode(key, value)
else -> throw Exception("暂时不支持这类型");
}
}
/**
* 读取
*/
fun get(key: String): String? {
return MMKV.defaultMMKV().decodeString(key)
}
fun getLong(key: String): Long {
return MMKV.defaultMMKV().decodeLong(key)
}
fun getInt(key: String): Int {
return MMKV.defaultMMKV().decodeInt(key)
}
fun getBool(key: String): Boolean {
return MMKV.defaultMMKV().decodeBool(key)
}
fun getDouble(key: String): Double {
return MMKV.defaultMMKV().decodeDouble(key)
}
fun getFloat(key: String): Float {
return MMKV.defaultMMKV().decodeFloat(key)
}
/**
* 直接将值保存到EditText
*/
fun setEditText(key: String, edit: EditText) {
var value = MMKV.defaultMMKV().decodeString(key)
value.let {
edit.setText(it)
}
}
/**
* 直接将值保存到TextView
*/
fun setTextView(key: String, edit: TextView) {
var value = MMKV.defaultMMKV().decodeString(key)
value.let {
edit.text = it
}
}
}
类型判断并且转成类型:
fun hasPrefix(x: Any) = when(x) {
is String -> x.startsWith("prefix")
else -> false
}
范围:
when (x) {
in 1..10 -> print("x is in the range")
in validNumbers -> print("x is valid")
!in 10..20 -> print("x is outside the range")
else -> print("none of the above")
}
示例代码声明
class Developer (@JvmField val name: String, val ide: String)
使用@JvmField,我们在Java中调用的时候,可以直接使用属性名,而不是对应的getter方法。
//test jvmField
Developer developer = new Developer("Andy", "Android Studio");
System.out.println(developer.getIde());// not using JvmField
System.out.println(developer.name);// using JvmField
fun t1(name:String) = flow{
println("flow start : $name")
for(i in 0..3){
kotlinx.coroutines.delay(100)
emit("$name $i")// 向外面发一个数据
}
}
runBlocking{// 所有线程一起运行(顺序的话就删除launch就好)执行线程(流)执行完
launch {
t1("1").collect {
println("get1 $it")
}
}
// 开启第二个流
launch {
t1("2").collect {
println("get2 $it")
}
}
// 同一个流监听两次
launch {
val t = t1("3")
t.collect {
println("get4 $it")
}
t.collect {
println("get4 $it")
}
}
}
快速创建:
(1..3).asFlow().collect { value -> println(value) }
但是你不能修改延迟,所以可以增加map处理,或者增加过虑 filter
runBlocking {
launch {
(1..10).asFlow() // 一个请求流
.filter {
it % 2 == 0 // 只显示偶数
}
.map {
// 每个个过来的都延迟1000秒
delay(100)
"hi $it";
}
.collect { response -> // 指定变量名字,不再是it
println(response)
println(response)
// 这里延迟也有用的
delay(1000)
}
}
增加数据:
(1..3).asFlow() // 一个请求流
.transform { request ->
emit("Making request $request")
emit(performRequest(request))
}
.collect { response -> println(response) }
限制数据,例如只处理两次:
fun numbers(): Flow<Int> = flow {
try {
emit(1)
emit(2)
println("This line will not execute")
emit(3)
} finally {
println("Finally in numbers")
}
}
fun main() = runBlocking<Unit> {
numbers()
.take(2) // 只获取前两个
.collect { value -> println(value) }
}