1、textview的gravity可以有多个属性吗?
可以有多个属性,中间可以用 | 来表示。
2、Android会将Button上的英文字母转化为大写吗?
会的
3、如何将Button上的英文字母转化为小写?
增加textAllCaps属性
4、progressBar如何设置水平进度条?
可以增加style属性
style="?android:attr/progressBarStyleHorizontal"
5、RecyclerView的onCreateViewHolder中的viewType是干什么的?
是用来从根据viewType创建不同的布局而实现的。
6、通知列表有新数据的插入,应该使用什么方法?
notifyItemInserted()
7、密封类有什么作用?
使用密封类以后,
(1)我们在写when语句的时候,就不需要写else语句了。
(2)在处理逻辑的时候,必须要处理所有的子类,这样可以在编译的时候就发现潜在的问题。
fun getResult(a: Result) = when (a) {
is AImpl -> ""
is BImpl -> ""
}
sealed class Result
class AImpl() : Result()
class BImpl() : Result()
8、如何在Fragment中實現返回棧的功能?
transaction.addToBackStack(null)
9、什么事双页模式?
有一个文件夹layout,内部有一个activity_main,同时有一个文件夹layout-large,内部有一个activity_main,这种就叫做双页模式。
那些屏幕被认为large的,就会去加载layout-large目录下的文件,而小屏幕的手机会加载layout 目录下的文件。
10、android中常用的限定符是什么?
限定符是用来标记,在不同大小的手机上,或者在不同分辨率的手机上,或者是在不同方向的手机上,使用不同的布局。
11、最小限定符是什么?
最小限定符是:当大于某个值时,会使用一个布局,当小于某个值时,会使用另外一个布局。
比如layout-sw600dp目录下有一个layout_main,layout目录下有一个layout_main。
当程序在屏幕宽度 大于等于(>=)600dp的设备上时,会加载layout-sw600dp下的布局,然后屏幕宽度在小于600dp的设别上时,会加载layout目录下的布局文件。
12、 扩展函数是什么?
可以不修改某个类(比如View)源码的情况下,仍然可以向这个类中添加新的函数。
13、扩展函数的命名规则是什么?
创建一个文件,和要扩展的类保持一致,比如创建 String.kt 就是用来扩展String类。
14、如何对字符串进行反转?
使用扩展函数reversed()
15、如何对字符串首字母进行大写?
使用扩展函数 capitalize()
16、kotlin中运算符重载有什么用?
运算符重载,可以让两个对象进行相加,或者进行其它的运算的操作。
17、运算符重载中,运算符相加如何实现?
class Obj{
operator fun plus(obj:Obj):Obj{
// 处理相加的逻辑
}
}
其中加好运算符对应的是plus,减号运算符对应的是minus,所以其中operator关键字和plus是固定不变的,而接受的参数和函数的返回值是可以自己定义的。
最终可以实现的效果如下,两个对象相加
val money1 = Money()
val money2 = Money()
val money = money1 + money2
18、如何实现 str * 5 就返回str5次的拼接?
主要还是使用repeat函数,代码如下:
val str = "aaa"
val sb = StringBuffer()
repeat(5) {
sb.append(str)
}
Log.i("cdx", sb.toString())
还可以进行简化:
"aaa".repeat(5)
19、在8.0以后,广播有什么要求?
(1)除了少数的系统广播可以使用静态注册,比如开机启动的广播。
(2)所有的隐式广播不允许使用静态的方式来注册。
20、隐式广播是什么?
没有指定发送给哪个应用的广播。
21、广播的onReceive方法中为什么不能添加过多的逻辑?
(1)onReceive方法中不能开启线程。
(2)onReceive方法运行了较长时间而没有结束的时候,就会出现错误。
22、强制下线功能如何实现?
(1)创建一个BaseActivity。
(2)在BaseActivity的onResume中动态注册广播。
(3)然后在onPause中解除注册广播。
这样的话,当用户在任何一个界面,当强制下线的时候,就会在当前页面弹出来重新登录的弹框,确保在栈顶的元素能够收到这个通知。
23、高阶函数是什么?
如果一个函数接受另外一个函数作为参数,或者返回值的类型是另外一个函数,那么该函数就是高阶函数。
24、apply函数有什么用?
apply可以用来提供一个上下文,当我们需要多次调用一个对象的多个方法时,apply可以让代码更加简洁。
25、内联函数的工作原理是什么?
kotlin编译器会将内联函数中的代码在编译的时候,自动的替换到调用它的地方,这样就不存在运行时的开销了。
26、内联函数的优点?
内联函数可以完全消除lambda表达式所带来的运行时的开销。
27、noinline 有什么作用?
如果一个函数有2个函数类型的参数,如果只想给其中的一个增加内联,另外的一个不增加内联,可以使用这个关键字在参数的前面。
28、lanbda中可以直接使用return关键字吗?
不能直接使用return关键字,而应该使用return@方法名字这样的形式,表示局部返回。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
test("a"){
if (true) return@test
"ccc"
}
}
fun test(str: String, funa: () -> Unit) {
funa.invoke()
}
}
29、可以在内联函数中直接使用return吗?有什么效果?
可以在内联函数中,直接使用return。
内联函数中return以后的,还有调用内联函数以后的地方都不会执行了。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
test("a"){
if (true) return
"ccc"
}
}
inline fun test(str: String, funa: () -> Unit) {
funa.invoke()
// ccc、ddd都不再执行
"dddd"
}
}
30、下面的代码会出现错误吗?
会出现错误,当我们在高阶函数中,创建了另外的Lambda或者匿名内部类的形式,并且在这个匿名内部类中调用函数类型参数,这个时候如果将高阶函数设置为内联函数,就会报错。
inline fun runRunnable(block: () -> Unit) {
val runnable = Runnable{
block()
}
}
31、30的问题如何解决?
inline fun runRunnable(crossinline block: () -> Unit) {
val runnable = Runnable{
block()
}
}
crossinline 关键字就像是一个契约,它用于保证内联函数的lambda表达式中一定不会用到return。