Android 引入布局 提升效率
问题
假设有多个Activity需要标题栏,且标题栏的样式都是一样的,那么怎么操作才能提高工作效率?
方案
可以定义一个公共的标题栏布局,然后每个Activity布局引用这个公共布局即可。
公共标题栏布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:background="#020" android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:id="@+id/titleBack" android:text="Back" android:textColor="#fff" android:layout_margin="5dp" android:layout_gravity="center" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView android:id="@+id/titleText" android:text="Title Text" android:textColor="#fff" android:textSize="24sp" android:layout_gravity="center" android:gravity="center" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content"/> <Button android:id="@+id/titleEdit" android:text="Edit" android:textColor="#fff" android:layout_gravity="center" android:layout_margin="5dp" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout>
Activity中引入标题栏布局
<?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>
可以看到使用<include layout="layout path">就可以引入公共XML资源,layout写入资源路径。
因为每个Activity都有自己默认的标题栏布局,所以还需要禁用Activity默认的标题栏布局
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val bind = ActivityMainBinding.inflate(layoutInflater) setContentView(bind.root) supportActionBar?.hide() } }
代码:supportActionBar?.hide() 就是禁用默认的标题栏布局,因为ActionBar可能为空,所以这里使用了?.操作符,使用java代码的时候也别忘记判断空逻辑。
问题
我们再延申一个新的问题,上面代码的标题栏中“back”按钮一般都是销毁当前Activity退出页面,试想如果每个Activity都是用<include>加载这个布局,是不是都需要自己手动写一遍onClick事件来实现退出页面功能?
方案
我们可以自己定义一个控件来解决这个问题
定义控件TitleLayout
class TitleLayout(context: Context, attrs: AttributeSet): LinearLayout(context, attrs) { init { LayoutInflater.from(context).inflate(R.layout.title, this) val back = findViewById<Button>(R.id.titleBack) back.setOnClickListener { val activity = context as Activity activity.finish() } } }
其实就是新建一个类,并继承LinearLayout;然后在init中加载我们之前定义的标题栏资源(R.layout.title),然后使用LayoutInflater把标题栏资源加载进来,获取back按钮元素,添加点击事件
最后一步就是把<include>替换成我们新定义的控件即可
<?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" android:id="@+id/title_layout"/>--> <com.shibin.uicustomviews.TitleLayout android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout>
这样就完美解决了公共布局资源使用以及重复事件处理的问题。
posted on 2023-06-28 09:56 Devil'soul 阅读(26) 评论(0) 编辑 收藏 举报