第一行代码第三版

178 阅读1分钟

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。