先来看下布局和控件的继承结构
可以看到,所有的控件都是继承或者间接继承View。所用到的布局也是直接或者间接继承View,View是最基本的一种UI组件,可以绘制一个矩形区域,并且能够响应这块区域各种事件。
在Layout中国新建一个title,xml的布局,代码如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:background="#F50313" android:layout_height="wrap_content"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/titleBack" android:layout_gravity="center" android:text="返回" android:textColor="#fff"/> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:gravity="center" android:text="标题" android:layout_weight="1" android:textColor="#fff" android:textSize="24sp"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_margin="5dp" android:text="编辑" android:textColor="#FFF"/> </LinearLayout>
反正没人看,丑就丑吧
然后将activity_main.xml代码改写为:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <include layout="@layout/title"/> </LinearLayout>
并在MainActivity中加入一行代码,将原本的标题栏隐藏
supportActionBar?.hide()
一个标题两个按钮就出来了。
但是这不算自定义控件,因为我们现在无法对按钮的点击事件作出反应。
新建一个TitleLayout继承LinearLayout。让它成为我们的自定义标题栏控件。并且定义了两个按钮的点击事件回调,代码如下:
import android.app.Activity
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.widget.LinearLayout
import android.widget.Toast
import kotlinx.android.synthetic.main.title.view.*
class TitleLayout(context: Context, attrs:AttributeSet) :LinearLayout(context,attrs){
init {
LayoutInflater.from(context).inflate(R.layout.title,this)
titleBack.setOnClickListener {
val activity=context as Activity
activity.finish()
}
titleEdit.setOnClickListener {
Toast.makeText(context,"你点击了编辑",Toast.LENGTH_LONG).show()
}
}
}
现在自定义控件已经创建好了,接下来就可以在布局文件中添加了。修改activty_mai的代码。
<com.ljx.listviewtest.TitleLayout android:layout_width="match_parent" android:layout_height="wrap_content"/>
运行结果如上。先这样,睡觉