《第一行代码》第三版笔记三

目录

第四章

4.1、常用控件

4.1.1、TextView

4.1.2、Button

4.1.3、 EditText

4.1.4、ImageView

4.1.5、ProgressBar

4.1.6、AlertDialog

4.2、基本布局

4.2.1、LinearLayout

4.2.2、RelativeLayout

4.2.3、FrameLayout

4.3、引入布局

4.4、RecyclerView

4.5、 延迟初始化和密封类


第四章

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:空间的宽度

        match_parent:表示让当前控件的大小和父布局大小一样
        wrap_content:表示让当前控件大小能够刚好包含住里面的内容
        控件的大小一般用dp,文字的大小一般用sp。
        gravity:设置自身内部元素的对齐方式(如果想要文字居中可使用 android:gravity="center"
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()
             }
         }
     }
 }
        通过AlertDialog.Builder构建一个对话框,setTitle设置标题、setMessage设置内容、setCancelable表示可否使用Back键关闭对话框等属性,setPositiveButton() 方法表示为对话框设置确定按钮的点击事件,setNegativeButton()方法表示为对话框设置取消按钮的点击事件,最后调用 show() 方法将对话框显示。
4.2、基本布局
4.2.1、LinearLayout
        LinearLayout:线性布局。该布局会将它所包含的控件在线性方向上依次排列。需要指定线性排列方向。orientation用来指定排列方向,有水平(horizontal)和垂直(vertical)两个选项。
        layout_gravity:用于表示自身相对于父布局的对齐方式。
        layout_weight:允许使用比例的方式来指定控件的大小。使用方法:
<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}"
}

        密封类及其所有子类只能定义在同一个文件的顶层位置,不能嵌套在其他类中。

        

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值