Kotlin安卓开发学习(4)

前面我们学习了Kotlin 的基本语法,但我们最终的目的是作为安卓开发。因此,我们需要学习安卓的页面开发知识。

Activity

Activity是安卓开发的最重要组成之一,它是一种可以包含用户界面的组件,主要用于和用户进行交互。(个人看来暂时类似于Html中使用的js)

在Android Studio中,我们可以提供右键->new->Activity来创建一个新的Activity。此时除了最基础的样式外,通过勾选 Generate Layout File 来自动创建一个绑定的布局文件,勾选 Lancher Activity 表示将当前Activity当作项目主Activity。

所有的Activity都要在AndroidManifest.xml中进行注册才能生效如下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.activitytest">
     <application
         android:allowBackup="true"
         android:icon="@mipmap/ic_launcher"
         android:label="@string/app_name"
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
         android:theme="@style/AppTheme">
         <activity android:name=".FirstActivity"
         </activity>
      </application>
</manifest>

Activity的注册声明要放在<application>标签内,使用android:name来指定具体注册哪一个Activity,而Activity的位置通过package属性指明了。

通过内部加入<intent-filter>标签并在这个标签内添加<actionandroid:name="android.intent.action.MAIN"/><categoryandroid:name="android.intent.category.LAUNCHER" />这两句声明即可配置主Activity(即最先启动的Activity)

除此之外,我们还可以使用android:label指定Activity中标题栏的内容

需要注意的是,给主Activity指定的label不仅会成为标题栏中的内容,还会成为启动器(Launcher)中应用程序显示的名称,具体如下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.activitytest">
     <application
         ...>
         <activity android:name=".FirstActivity"
             android:label="This is FirstActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
      </application>
</manifest>

Layout

正如Activity对应了HTML中的js,Android通过创建xml格式的layout布局文件来对应HTML中的html。

在创建布局文件时,可以选择当前布局的根元素(一般为LinearLayout),之后我们就可以在根元素内部添加新的元素了。

这里我们拿Button按钮元素来举例。

我们可以使用 <Button/>来创建按钮元素,同时也可以通过内部属性来实现属性定义:

<Button
 android:id="@+id/button1"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:text="Button 1"
/>

我们来分析一下这里的几个属性的意思:

首先 android:id表示这个元素的id即该元素的唯一标识符。不过我们需要注意后面属性值的写法。在xml中@id/button1表示资源(id)引用,与之相对应的,如果我们需要定义一个id,则需要加上“+”,即上面@+id/button1

之后的 android:layout_widthandroid:layout_height分别指定了当前元素的宽度和长度。“match_parent”表示和父元素相同大小。“wrap_content”表示大小只需刚刚包住内部内容即可。

最后android:text指定了元素中显示的文字内容。

Toast

Toast是Android提供的一种非常好的提醒方式,在程序中可以使用它将一些短小的信息通知给用户,这些信息会在一段时间后自动消失,并且不会占用任何屏幕空间。

首先需要借由上文的Button定义一个弹出Toast的触发点。在onCreate()方法中添加如下:

override fun onCreate(savedInstanceState: Bundle?) {
     super.onCreate(savedInstanceState)
     setContentView(R.layout.first_layout)
     val button1: Button = findViewById(R.id.button1)
     button1.setOnClickListener {
         Toast.makeText(this, "You clicked Button 1", Toast.LENGTH_SHORT).show()
     }
}

在Activity中,可以通过findViewById()方法获取在布局文件中定义的元素,这里我们传入R.id.button1来得到按钮的实例,这个值是在first_layout.xml中通过android:id属性指定的。

findViewById()方法返回的是一个继承自View的泛型对象,因此Kotlin无法自动推导出它是一个Button还是其他控件,所以我们需要将button1变量显式地声明成Button类型。

得到按钮的实例之后,我们通过调用setOnClickListener()方法为按钮注册一个监听器,点击按钮时就会执行监听器中的onClick()方法。因此,弹出Toast的功能当然是要在onClick()方法中编写了。

Toast的用法非常简单,通过静态方法makeText()创建出一个Toast对象,然后调用show()将Toast显示出来就可以了。

makeText()方法需要传入三个参数,第一个参数是Context,也就是Toast要求的上下文,由于Activity本身就是一个Context对象,因此这里直接传入this即可。第二个参数是Toast显示的文本内容。第三个参数是Toast显示的时长,有两个内置常量可以选择:Toast.LENGTH_SHORTToast.LENGTH_LONG

这里我们还能再简化一下。使用Kotlin编写的Android项目在app/build.gradle文件的头部默认引入了一个kotlin-android-extensions插件,这个插件会根据布局文件中定义的控件id自动生成一个具有相同名称的变量,我们可以在Activity里直接使用这个变量,而不用再调用findViewById()方法了。

因此,我们在写Activity时,直接写元素的id即可,不需要再查找:

override fun onCreate(savedInstanceState: Bundle?) {
     super.onCreate(savedInstanceState)
     setContentView(R.layout.first_layout)
     button1.setOnClickListener {
         Toast.makeText(this, "You clicked Button 1", Toast.LENGTH_SHORT).show()
     }
}