kotlin数组初始化
Array今天在leetcode刷题时,突然发现,自己不会使用最基础的数组以及他的初始化。所以在这里说明一下
使用arrayOf()这是官方推荐的一种写法,他接受的时可变长参数,也就是可以接受任意的参数,直接生成一个数组。
使用arrayOfNull<>(n),初始化一个数组全为空,接受参数为数组的大小。
直接使用Array()生成数组。他又两种构造器
直接传递一个int,这个就是他的size。
除了传递一个int外,还可以传递一个lambda函数,作为数组的初始值。
Kotlin延迟初始化和密封类,内部类
延迟初始类
这个应用的前提:很多情况下,我们会先初始化一个类,但是因为没有给他赋值,就给他赋值为null。如:
1private var adapter: MsgAdapter? = null
而在kotlin中,对于可能为空的变量,需要进行很多次非空判断,非空保护,即便你知道他不可能为空。以满足他的语法规则。
延迟初始化然后这里提供一种方法:
1private lateinit var adapter: MsgAdapter
lateinit这个关键字表明当前这个变量不会立刻初始化,而是会在后面的步骤中赋值。但是他也有一个问题,如果你在使用这个变量时,没有赋值,他会抛出没有初始化的异常UninitializedPropertyAccessException。解决这个问题的方法就是在给他初始化的时候加一个判断是否初始化。
123if (!::adapter.isInitialized) { adapter = MsgAdapter(msgList) }
这是一个固定的语法规则,能判断是否完成初始化。
密封类密封类的关键字是sealed class,使用它可以构 ...
Android入门(RecyclerView控件)
RecyclerView控件首先,他并不是系统自带的控件,而是在androidx中的,也就是还需要从外部导入。不过好在IDEA已经帮我们导入过了,在build.gralde中
12345678910dependencies { implementation 'androidx.core:core-ktx:1.7.0' implementation 'androidx.appcompat:appcompat:1.4.1' implementation 'com.google.android.material:material:1.5.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.3' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext ...
Android入门(listview控件)
很烦,,,写了好久然后浏览器闪退了。。。然后写的全无了。所以再写一遍就随便写点了。使用listview的关键。
基本使用
直接在布局引入一个listview控件
然后因为listview的数据不能直接传入。需要通过adapter适配器来实现的,其中最常用的就是arrayAdapter
因此在activity中,初始化一个arrayAdapter。 他的初始化一共需要三个参数。
activity:也就是需要把本类传进去。
resourceid: 需要传入子项布局(也就是listview中每一项内容的样式布局)(可以使用系统默认的,也可以自己定义一个布局。这里不展示)
data:传入数据源,一般都是列表。
然后使lisview的adapter属性赋值为你初始的内容1listview.adapter = arrayAdapter<String>()
然后即完成了基本使用。
进阶使用主要就是修改第二个参数,resourceid,也就是你自己定义的布局和样式。但是你不止需要样式,还需要设置逻辑。因此这里选择再写一个适配器FruitAdapter去继承ArrayAdapter,然 ...
Android自定义控件(详解)
在本质上,所有的控件和布局都是View类的子类。也就是说明,在理论上,你可以自己手搓一个控件,也就是自定义控件。而且定义自己的方法和图形,界面等。而这都是可行的。
三种自定义控件自绘控件自绘控件的意思就是,这个View上所展现的内容全部都是我们自己绘制出来的。这是一个完完全全由自己设计的控件
组合控件组合控件的意思就是,我们并不需要自己去绘制视图上显示的内容,而只是用系统原生的控件就好了,但我们可以将几个系统原生的控件组合到一起,这样创建出的控件就被称为组合控件。
继承控件继承控件的意思就是,我们并不需要自己重头去实现一个控件,只需要去继承一个现有的控件,然后在这个控件上增加一些新的功能,就可以形成一个自定义的控件了。这种自定义控件的特点就是不仅能够按照我们的需求加入相应的功能,还可以保留原生控件的所有功能,比如 Android PowerImageView实现,可以播放动画的强大ImageView 这篇文章中介绍的PowerImageView就是一个典型的继承控件。
布局文件转化成view类(三种方式)1.//context:上下文, resource:要转换成v ...
Android自定义控件
布局和控件的继承关系
引入布局我们可以自定义一个布局,然后把这个布局当作一个控件通过<include layout="布局文件">标签实现引入。比如自己设计的标签栏设计为一个布局文件,然后把这个布局文件当作一个控件,然后去引入他。但是,这样子的控件没有统一设定的逻辑,只有样式,没有逻辑程序设计,如果每个调用该布局的都重写一遍逻辑结构,就会有很多的冗杂代码。因此
创建自定义控件实现控件的逻辑自洽。不用再去花更多的代码去重复操作。
新建TitleLayout继承自LinearLayout,让它成为我们自定义的标题栏控件,代码如下所示:
12345class TitleLayout(context: Context, attrs: AttributeSet) : LinearLayout(context, attrs) { init { LayoutInflater.from(context).inflate(R.layout.title, this) }}
这里我们在TitleLayout的主构造函数中声明了Conte ...
Android常用布局
布局和控件的关系
LinearLayout
属性
释义
样例
orientation
指定了排列方向
vertical,horizontal
layout_gravity
控制控件的对齐方式
layout_weight
指定控件的大小
一般会将layout_width指定为0dp,这是一种标准的写法
layout_weight的计算方式系统会先把LinearLayout下所有控件指定的layout_weight值相加,得到一个总值,然后每个控件所占大小的比例就是用该控件的layout_weight值除以刚才算出的总值。因此如果想让EditText占据屏幕宽度的3/5,Button占据屏幕宽度的2/5,只需要将EditText的layout_ weight改成3,Button的layout_weight改成2就可以了。
RelativeLayout相对布局
1234567<Button android:id="@+id/button5" android:layout_width="wrap_conten ...
Android常用控件
常用控件TextView显示文本
属性
释义
样例
gravity
来指定文字的对齐方式
top,bottom,start等
textColor
指定文字颜色
red,green
textSize
指定文字大小
sp为单位,这样当用户在系统中修改了文字显示尺寸时,应用
程序中的文字大小也会跟着变化。重新运行程序
text
指定文字内容
Button放置按钮
属性
释义
样例
textAllCaps
指定文字是否大小写
false,true
注册Button点击事件的方式
函数式API123button.setOnClickListener { // 在此处添加逻辑 }
2.用实现接口的方式来进行注册 12345678910111213141516 class MainActivity : AppCompatActivity(),View.OnClickListener { override fun onCreate(savedInstanceState: Bundle?) { sup ...
Kotlin标准方法with,run,apply AND 静态方法
标准函数with,run,apply123456789101112131415161718192021222324252627282930313233343536373839404142fun main() { //常用写法 val list = listOf("apple", "banana", "orange", "pear", "grape") val builder = StringBuilder() builder.append("Start eat fruits\n") for (fruit in list) { builder.append(fruit + "\n") } builder.append("Ate all fruits\n") println(builder) //使用with作为标准函数来写 // ...
Activity最佳实践
知晓当前时哪一个activity直接创建一个kotlin的类,,他与Activity的创建方法不一样。创建BaseActivity类
12345678open class BaseActivity:AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) Log.d("BaseActivity",javaClass.simpleName) //javaClass表示获取当前实例的class对象,相当于在java中调用getClass方法 //::class.java表示获取BaseActivity类的Class对象。相当于在Java中调用BaseActivity.class反射 ActivityCollector.addActivity(this) }
然后在把其他的类从继承AppCompatAc ...