android布局复用 & 自定义控件

来源:互联网 发布:建网站主流软件 编辑:程序博客网 时间:2024/06/07 23:31
        android中View的概念非常重要,它是用户和手机交互的桥梁,就是说android手机向用户展示的界面内容、你向手机输入的内容的这个交互过程是通过View来实现的。android的布局是在View的基础上建立起来的,这个概念简单理解就是多个控件组成一个布局,布局又可以相互嵌套,就可以编写出丰富多彩的界面了。

       布局复用: 布局复用的两个关键标签:include,merge。

 如果你对android的基础控键(TextVeiw,EditText,Button,ImageView....),常用基本布:LinearLayout,RelativeLayout,已经有所了解了,你就会知道android项目中布局文件(.xml文件)是放在res-layout文件夹下的,我们知道一个复杂的界面,它的布局是必然是嵌套多层形成的(但出于性能考虑,最好不要超过三层嵌套),也许你做android项目时,会发现同一个工程中不同的界面中,有很多相同的布局成分,那么有没有必要在每一个界面中都去写这个相同的布局成分呢?答案显然是没有必要的,完全可以做到布局复用:现在布局文件中定义好所有需要多次使用的布局,然后在需要引用的界面的xml文件的具体位置调用:<include layout="@layout/布局文件名",就可以将自定义布局引用到调用的位置,就达到了布局复用的效果,减少代码冗余(原理很简单,就是一行核心代码,就不附上源码咯!!!)。merge 标签的关键字,解决ViewGroup重复叠加,性能提升。ViewStub定义时指定一个layout ,轻量级View,在调用inflate()方法前不会占用任何布局位置,看不见。通过inflate()方法才会加载布局。

      自定义控件:   你已经学会布局复用了,那自定义控件又是什么玩意呢?先别急,我们想象一个场景,大多数的手机都会用三个按键/虚拟按键:返回键,菜单键,后台程序键,无论我们处于哪个界面,这三个按键的功能其实都是一样的:返回键销毁当前活动,菜单键回到主页面,后台程序键查看后台的应用。如果我们在每一个界面都去编写相同的业务逻辑,那显然不符合程序开发的代码复用原则。那你又要问了,我不是已经通过布局服用减少了代码冗余吗?但是再深入一点你就会发现你引入的布局只是在界面的展现,如果你要实现业务逻辑(事件的监听和响应)​,而这个业务逻辑又是相同的(例如返回键:销毁当前活动,对到上一个活动),那么你每一次引用这个布局,都要去编写一次相同的业务逻辑事件,这个就是相当大的冗余了。如果说布局复用是减少界面的冗余,那自定义控件就是减少相同业务逻辑的冗余了,所以自定义控件就非常有意义了。

    为了更好的理解自定义控件​,我们实际操作一个简单案例(当然自定义控件功能强大,可以大有作为):界面中要引用一个相同菜单布局,返回键销毁当前活动,删除键删除当前文本内容。

1:先建立一个android工程,在res文件下的layout文件下新建action.xml文件​(只是测试自定义控件,这里只是最简单的界面,实际需要界面的美化化和性能考虑)

​<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >        <TextView         android:id="@+id/show_txt"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="原来的内容,你想怎么操作呢??功能按钮在下面哦:你可以返回,也可以删除我哦"        />    <Button         android:id="@+id/back_btn"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="返回"        />    <Button         android:id="@+id/delete_btn"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="删除"        /></LinearLayout>

2:在​项目的src java源文件中新建class:ActionDemo并且继承LinearLayout


public class ActionDemo extends LinearLayout{        private TextView showTxt;    public ActionDemo(Context context, AttributeSet attrs) {        super(context, attrs);        LayoutInflater.from(context).inflate(R.layout.action, ActionDemo.this);                showTxt = (TextView)findViewById(R.id.show_txt);        Button backButton  = (Button)findViewById(R.id.back_btn);        Button deleteButton  = (Button)findViewById(R.id.delete_btn);        backButton.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                ((Activity)getContext()).finish();            }        });                deleteButton.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                showTxt.setText("");            }        });    }}

解释构造函数: public AtionDemo(Contextcontext, AttributeSet attrs)

是在引用这个自定义控件时调用的,动态加载需要布局过滤器(LayoutInflater)对象的inflate方法,所以我们写的LayoutInflater.from(context)在当前上下文创建一个LayoutInflater对象,然后调用inflate方法,第一个参数:R.layout.action指定布局文件,第二个参数:AtionDemo.this指明加载的布局的父布局。为按钮设置好监听,就是我们所说的相同的业务逻辑功能了。


3:自定义控件的调用

 在layout文件夹下main_activity中加入引用的自定用控件的代码:

com.jola.self_userdefine_ui.ActionDemo​自定义控件java代码 包名.类名

 <com.jola.self_userdefine_ui.ActionDemo            android:layout_width="wrap_content"            android:layout_height="wrap_content">        </com.jola.self_userdefine_ui.ActionDemo>

​4虚拟机上运行:点击“返回”按钮:销毁当前活动,点击“删除”按钮:文本内容删除了

做好了自定义控件,在其它任何地方引用都可以实现先相同的功能,而不必要多次编写业务逻辑代码,实现代码的复用。


总结:布局复用,可以使定义的布局在不同的界面中多次引用,核心代码自定义控件,是布局复用的升级,不仅是布局的复用,更是业务逻辑功能的复用。定义好相同功能的控件后,​在java源代码中新建claa类,实现相同的业务逻辑。编写完成后,引用自定义控件核心代码:包名.类名,而不用在调用的界面编写相同的业务逻辑代码了。


  Android 交流成长,如有漏洞,欢迎斧正!​


1 0