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

目录

第四章

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}"
}

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

        

  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1. 面向对象编程的特点: - 封装:将数据和方法组合成一个类,并对外提供接口,隐藏内部实现细节,保证数据安全性和代码的可维护性。 - 继承:通过子类继承父类的属性和方法,实现代码的复用和扩展。 - 多态:同一种行为在不同情境下的不同表现形式,可以通过重载、重写和接口实现。 2. 类和对象: - 类是一种抽象的概念,是描述对象具有的属性和方法的模板。 - 对象是类的一个实例,具有这个类所描述的属性和方法。 3. 成员变量和成员方法: - 成员变量是描述对象状态的数据,可以是基本类型、对象类型或数组类型。 - 成员方法是描述对象行为的操作,可以是构造方法、普通方法、静态方法和抽象方法。 4. 构造方法和析构方法: - 构造方法是创建对象时调用的特殊方法,用于初始化对象的成员变量。 - 析构方法是销毁对象时调用的特殊方法,用于释放对象占用的资源。Java中不需要显式地调用析构方法,由垃圾回收器自动回收。 5. 访问控制: - 访问控制可以限制类的成员变量和成员方法的访问范围,保证数据的安全性和代码的可维护性。 - Java中有四种访问控制修饰符:public、protected、default、private。 6. 静态变量和静态方法: - 静态变量属于类,不属于对象,被所有对象共享。 - 静态方法可以通过类名调用,不需要创建对象。 7. final关键字: - final可以修饰类、成员变量和成员方法。 - final修饰的类不能被继承,修饰的变量是常量,修饰的方法不能被重写。 8. 抽象类和接口: - 抽象类是一种不能被实例化的类,只能作为父类被继承,可以包含抽象方法和普通方法。 - 接口是一种完全抽象的类型,只包含抽象方法和常量,用于定义规范和约束。类可以实现多个接口。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值