【Android】kotlin和安卓基础学习

kotlin和as日常使用方面

kotlin基础方面

记录的是上一周学习的内容,都是之前用Java写安卓的时候没有遇见过的属性,方法,关键字,或者之前没有了解的各种。

  1. kotlin点击返回事件,onBackPressed()
  2. lambda表达式,表示匿名函数抽象化,
  3. Unit表示无返回值
  4. typealias类型别名,缩短或替代原有类型
  5. by关键字,将具体接口或类实现委托给别人,而自己只需要使用特定需要关心的部分,或者完全交由委托
  6. 迭代的方式
    (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) { }
  1. apply函数
    处理对象的多行初始化配置,好处:通过apply将初始化部分清晰地包裹在其中,可以在写法上减少临时对象的创建。
	mutableListOf<String>().apply {
	 add("1")
	 add("2")
	 add("3")
	}
  1. let函数
    处理可控性判断后的多次调用,适合做空判断后的连续调用。
	val user: User? = UserManager.getCurrUser()
	user?.let {it ->
	    it.name = "xxx"
	    it.age = 19
	}
  1. with函数
    对同一个非空对象的连续调用,
	val numbers = mutableListOf("one", "two", "three")
	val firstAndLast = with(numbers) {
	     "The first element is ${first()}," +
	     " the last element is ${last()}"
	}
	println(firstAndLast)
  1. 用 arrayOf 创建数组,只能创建引用类型的数组,因为 arrayOf 是一个泛型函数。用 intArrayOf、charArrayOf、booleanArrayOf 等特定函数可以创建对应类型的基础类型数组,从而避免的包装类型带来的装箱拆箱带的额外的损耗。
  2. 高阶函数指的是将函数类型作为参数或者返回值的函数,但函数类型本质还是一个对象,也就是每次调用函数时,都会创建对应的对象,比如将函数类型作为参数,那么每次调用时,其实都是创建一个额外的对象,使用 inline 关键字,将其内联化,减少对象创建。
  3. val不变量,val属性表示只读,默认生成一个getter。var可变量,var属性表示可写,默认生成一个getter、setter。属性懒加载,by lazy,只有首次调用时才会赋值,在调用之前都为空,减少初始化变量,后续调用只是返回值。 vararg来表示可变参数,其实就相当于不定长数组,如果想将数组类型传入到可变参数,就需要使用一个特定的符号 *。infix修饰表示为中缀函数。
  4. lateinit关键字,延迟初始化,目的避开kotlin对于变量声明时的赋值检查,用于我知道我会使用这个变量,我肯定会负责它的初始化,但是声明的时候目前无法初始化。lateinit需要特定操作时才需要使用。可以用isInitialized来判断是否初始化,只能修饰非基础变量,因为基础变量有默认值。不能修饰val变量,因为需要赋值,必须是var可变变量。by lazy目的懒加载,只有在使用到对应属性时才能出初始化创建,仅能修饰val不可变量。
  5. when 分支以及具有不超过一个 else 分支且仅占一行的 if 语句正文不需要大括号。除此以外,任何 if、for、when 分支、do 和 while 语句都需要大括号,即使主体为空或仅包含一个语句也是如此。
  6. 扩展函数
	class User(var name:String)
	
	/**扩展函数**/
	fun User.Print(){
	    print("用户名 $name")
	}
	
	fun main(arg:Array<String>){
	    var user = User("Runoob")
	    user.Print()
	}
输出结果
用户名 Runoob

若扩展函数和成员函数一致,则使用该函数时,会优先使用成员函数。
  1. 尾递归函数
    用tailrec修饰符标记,编译器会优化该递归,留下一个快速而高效的基于循环的版本,使用条件:函数必须将其自身调用作为它执行的最后一个操作。在递归调用后有更多代码时,不能使用尾递归,并且不能用在try/catch/finally块中。
  2. 数据类 class前加data修饰,密封类加sealed修饰符,内联类inline修饰符

as使用

  1. 函数名称大小写编写,camelCase,通常为动词或动词短语,允许出现下划线,用于分割名称的逻辑组成部分。@composablle注解且返回Unit的函数采用大小写形式并以名词形式命名,NameTag。函数名不带空格。
  2. 常量名称使用UPPER_SNAKE_CASE大小写形式,全部为大写字母,单词用_下划线分割。通常为名词或名词短语。非常量名称采用camelCase大小写形式编写。通常为名词或名词短语。
  3. 安卓添加项目依赖的时候可以使用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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值