目录
第四章
4.1、常用控件
4.1.1、TextView
TextView用于显示一段文本信息
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="This is TextView"/>
id:唯一标识符
layout_height:控件的高度
layout_width:空间的宽度
4.1.2、Button
Button用于点击事件的控件
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAllCaps="false"
android:text="Button" />
textAllCaps可以设置Button显示的文字是否为大写,true为大写,false为小写,默认为true.
4.1.3、 EditText
EditText允许用户在控件里输入和编辑内容
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Type something here"
android:maxLines="2"
/>
hint:属性可以指定一段提示性文本
maxLines:可以设置最大行数
4.1.4、ImageView
ImageView用于在界面上展示图片的一个控件
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/img_1"
/>
src:用于设置图片资源
4.1.5、ProgressBar
ProgressBar用于在界面上显示一个进度条
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="visible"
/>
visibility:表示控件是否可见。可选值有3种:visible、invisible和gone。visible表示控件是可见的,为默认值。invisible为不可见,但是仍然占据原来的位置和大小。gone表示控件不可见且不占据原来的位置和大小。
4.1.6、AlertDialog
AlertDialog可以在当前界面弹出一个对话框。这个对话框是置顶于所有界面元素之上的,能够屏蔽其他控件的交互能力。
override fun onClick(v: View?) {
when (v?.id) {
R.id.button -> {
AlertDialog.Builder(this).apply {
setTitle("This is Dialog")
setMessage("Something important.")
setCancelable(false)
setPositiveButton("OK") { dialog, which ->
}
setNegativeButton("Cancel") { dialog, which ->
}
show()
}
}
}
}
4.2、基本布局
4.2.1、LinearLayout
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/input_message"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="Type something"
/>
<Button
android:id="@+id/send"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Send"
/>
</LinearLayout>
将宽度指定成0dp,layout_weight设置为1,这样EditText与Button在水平方向上将均分占满屏幕的宽度。
4.2.2、RelativeLayout
RelativeLayout表示相对布局。可以通过相对位置让控件显示在任何位置。
4.2.3、FrameLayout
FrameLayout表示帧布局。该布局下所有的控件都会默认摆放在布局的左上角。
4.3、引入布局
先创建一个布局文件,在需要的布局文件中使用<include layout="@layout/title" />将前一个布局文件引入(这里前一个布局文件名为title)。
4.4、RecyclerView
1、在app/build.gradle的dependencies闭包中添加:
implementation 'androidx.recyclerview:recyclerview:1.0.0'
2、在布局文件中添加RecyclerView
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
3、创建列表项布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="60dp">
<ImageView
android:id="@+id/fruitImage"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_gravity="center_vertical"
android:layout_marginLeft="10dp"/>
<TextView
android:id="@+id/fruitName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="10dp" />
</LinearLayout>
4、定义实体类:
class Fruit(val name:String, val imageId: Int)
5、创建RecyclerViewAdapter适配器
class FruitAdapter(val fruitList: List<Fruit>) :
RecyclerView.Adapter<FruitAdapter.ViewHolder>() {
inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val fruitImage: ImageView = view.findViewById(R.id.fruitImage)
val fruitName: TextView = view.findViewById(R.id.fruitName)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.fruit_item, parent, false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val fruit = fruitList[position]
holder.fruitImage.setImageResource(fruit.imageId)
holder.fruitName.text = fruit.name
}
override fun getItemCount() = fruitList.size
}
6、在代码中使用RecyclerView
class MainActivity : AppCompatActivity() {
private val fruitList = ArrayList<Fruit>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
initFruits() // 初始化水果数据
val layoutManager = LinearLayoutManager(this)
recyclerView.layoutManager = layoutManager
val adapter = FruitAdapter(fruitList)
recyclerView.adapter = adapter
}
private fun initFruits() {
repeat(2) {
fruitList.add(Fruit("Apple", R.drawable.apple_pic))
fruitList.add(Fruit("Banana", R.drawable.banana_pic))
fruitList.add(Fruit("Orange", R.drawable.orange_pic))
fruitList.add(Fruit("Watermelon", R.drawable.watermelon_pic))
fruitList.add(Fruit("Pear", R.drawable.pear_pic))
fruitList.add(Fruit("Grape", R.drawable.grape_pic))
}
}
4.5、9-Patch图片
在png图片右击→Create 9-Patch file,点击确定即可得到一张.9图片。.9图片是一种被特殊处理过的png图片,能够指定哪些区域可以被拉伸,哪些区域不可以。
4.5、 延迟初始化和密封类
延迟初始化使用lateinit关键字。可以在需要的时候再变量进行初始化,不用在一开始时就将变量赋值为null。
密封类的关键字是sealed class。密封类与when表达式搭配使用,可以提供更好的模式匹配
创建一个密封类:
sealed class Result
class Success(val msg: String) : Result()
class Failure(val error: Exception) : Result()
在getResultMsg()方法中不需要else语句,可以提高代码的规范及安全性。
fun getResultMsg(result: Result) = when (result) {
is Success -> result.msg
is Failure -> "Error is ${result.error.message}"
}
密封类及其所有子类只能定义在同一个文件的顶层位置,不能嵌套在其他类中。