kotlin和as日常使用方面
- kotlin基础方面
- as使用
kotlin基础方面
记录的是上一周学习的内容,都是之前用Java写安卓的时候没有遇见过的属性,方法,关键字,或者之前没有了解的各种。
- kotlin点击返回事件,onBackPressed()
- lambda表达式,表示匿名函数抽象化,
- Unit表示无返回值
- typealias类型别名,缩短或替代原有类型
- by关键字,将具体接口或类实现委托给别人,而自己只需要使用特定需要关心的部分,或者完全交由委托
- 迭代的方式
(1)下标,通过indices获取下标的元素区间从而进行遍历
for (index in list.indices) { }
(2)下标与元素,通过withIndex()获取下标的元素与元素从而进行遍历
for ((index, item) in array.withIndex()) { }
(3)下标与元素,通过forEachIndexed在遍历时同时获取下标的元素
list.forEachIndexed {index, item -> }
(4)不关心下标的时候,非map,
for (item in list) { }
list.forEach { item -> }
(5)不关心下标的时候,map
map.forEach { key, value -> }
for ((key, value) in map) { }
- apply函数
处理对象的多行初始化配置,好处:通过apply将初始化部分清晰地包裹在其中,可以在写法上减少临时对象的创建。
mutableListOf<String>().apply {
add("1")
add("2")
add("3")
}
- let函数
处理可控性判断后的多次调用,适合做空判断后的连续调用。
val user: User? = UserManager.getCurrUser()
user?.let {it ->
it.name = "xxx"
it.age = 19
}
- with函数
对同一个非空对象的连续调用,
val numbers = mutableListOf("one", "two", "three")
val firstAndLast = with(numbers) {
"The first element is ${first()}," +
" the last element is ${last()}"
}
println(firstAndLast)
- 用 arrayOf 创建数组,只能创建引用类型的数组,因为 arrayOf 是一个泛型函数。用 intArrayOf、charArrayOf、booleanArrayOf 等特定函数可以创建对应类型的基础类型数组,从而避免的包装类型带来的装箱拆箱带的额外的损耗。
- 高阶函数指的是将函数类型作为参数或者返回值的函数,但函数类型本质还是一个对象,也就是每次调用函数时,都会创建对应的对象,比如将函数类型作为参数,那么每次调用时,其实都是创建一个额外的对象,使用 inline 关键字,将其内联化,减少对象创建。
- val不变量,val属性表示只读,默认生成一个getter。var可变量,var属性表示可写,默认生成一个getter、setter。属性懒加载,by lazy,只有首次调用时才会赋值,在调用之前都为空,减少初始化变量,后续调用只是返回值。 vararg来表示可变参数,其实就相当于不定长数组,如果想将数组类型传入到可变参数,就需要使用一个特定的符号 *。infix修饰表示为中缀函数。
- lateinit关键字,延迟初始化,目的避开kotlin对于变量声明时的赋值检查,用于我知道我会使用这个变量,我肯定会负责它的初始化,但是声明的时候目前无法初始化。lateinit需要特定操作时才需要使用。可以用isInitialized来判断是否初始化,只能修饰非基础变量,因为基础变量有默认值。不能修饰val变量,因为需要赋值,必须是var可变变量。by lazy目的懒加载,只有在使用到对应属性时才能出初始化创建,仅能修饰val不可变量。
- when 分支以及具有不超过一个 else 分支且仅占一行的 if 语句正文不需要大括号。除此以外,任何 if、for、when 分支、do 和 while 语句都需要大括号,即使主体为空或仅包含一个语句也是如此。
- 扩展函数
class User(var name:String)
/**扩展函数**/
fun User.Print(){
print("用户名 $name")
}
fun main(arg:Array<String>){
var user = User("Runoob")
user.Print()
}
输出结果
用户名 Runoob
若扩展函数和成员函数一致,则使用该函数时,会优先使用成员函数。
- 尾递归函数
用tailrec修饰符标记,编译器会优化该递归,留下一个快速而高效的基于循环的版本,使用条件:函数必须将其自身调用作为它执行的最后一个操作。在递归调用后有更多代码时,不能使用尾递归,并且不能用在try/catch/finally块中。 - 数据类 class前加data修饰,密封类加sealed修饰符,内联类inline修饰符
as使用
- 函数名称大小写编写,camelCase,通常为动词或动词短语,允许出现下划线,用于分割名称的逻辑组成部分。@composablle注解且返回Unit的函数采用大小写形式并以名词形式命名,NameTag。函数名不带空格。
- 常量名称使用UPPER_SNAKE_CASE大小写形式,全部为大写字母,单词用_下划线分割。通常为名词或名词短语。非常量名称采用camelCase大小写形式编写。通常为名词或名词短语。
- 安卓添加项目依赖的时候可以使用rootProject.xxx.XXX的全局变量添加。只需要在文件夹中创建.gradle后缀的文件,然后在该文件下创建
xxx{
dependencies=[
XXXX :"com.google.XXXX"
]
}
2、fragment显示,单个可以用
FragmentXXX fragment=new FragmentXXX();
FragmentTransaction transaction=getChildFragmentManager().beginTransaction();
transaction.add(R.id.XXX,fragment).commit();
多个可以用viewPager,首先先创建List<Fragment> fragmentArrayList()=new ArrayList();
然后用list.add添加fragment。再创建一个页面适配器
FragmentPagerAdapter mViewPagerAdapter=new FragmentPagerAdapter(getChildFragmentManager(),fragmentArrayList);
viewPager.setOffscreenPageLimit(2);
viewPager.setAdapter(mViewPagerAdapter);
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListenenr(){
//重写三个方法
@Override
public void onPageScrolled(int position,float positionOffset,int positionOffsetPixels){}//在屏幕滚动时不断调用
@Override
public void onPageSelected(int position){}//代表哪个页面被选中
@Override
public void onPageScrollStateChanged(int state){}//手指操作屏幕时发生变化,0(end)1(press)2(up)
}
3、视图绑定,优点就不用说了,算是现在安卓最优秀的方式。
将 viewBinding 元素添加到其 build.gradle 文件中。
viewBinding {
enabled = true
}
ps:通过设置 tools:viewBindingIgnore="true" 属性 来选择生成绑定类时忽略某个布局文件。
系统会通过以下方式生成绑定类的名称:将 XML 文件的名称转换为驼峰式大小写,并在末尾添加“Binding”一词。还是要给控件定义一个id,用来引用。
//这里使用lateinit是因为在需要binding时才给他初始化,具体可以参见上面的13条lateinit关键字的含义。
private lateinit var binding:ActivityMainBinding
override fun onCreate(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
binding=ActivityMainBinding.inflate(layoutInflater)
var view=binding.root
setContentView(view)