android布局复用 & 自定义控件
来源:互联网 发布:建网站主流软件 编辑:程序博客网 时间:2024/06/07 23:31
布局复用: 布局复用的两个关键标签: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 交流成长,如有漏洞,欢迎斧正!
- android布局复用 & 自定义控件
- 【android控件】dialog自定义布局
- Android自定义控件之流布局
- android 自定义控件--用viewGroup实现流式布局
- Android获取dialog自定义布局中的控件
- Android自定义控件实现及其布局
- Android 自定义控件布局 NullPointerException findViewById
- Android自定义控件实现及其布局
- Android自定义控件实现及其布局
- Android控件ListView自定义列表布局
- Android获取dialog自定义布局中的控件
- Android获取Dialog自定义布局中的控件
- Android中布局或控件自定义背景
- android自定义注解初始化布局控件(二)
- Android自定义控件实现及其布局
- Android获取dialog自定义布局中的控件
- Android 自定义控件之 继承布局文件
- 【Android自定义控件】布局悬停在顶部
- [服务器]一场台风引起的“”内存小知识“”
- [Android开发] Xposed 插件开发之一: Xposed入门
- Node.js Path模块
- 23种设计模式(3):抽象工厂模式
- PHP、JAVA、C#、Object-C 通用的DES加密
- android布局复用 & 自定义控件
- 20.获取网络图片,将图片存储在文件,缓存中,然后先从缓存中读取,没有再从文件中读取
- 机器学习 - 第一讲
- 利用ZooKeeper简单实现分布式锁
- 数组的sizeof
- sap记帐码
- [李景山php]每天laravel-20161119|Connector.php
- java冒泡排序
- 机器学习 - 第二讲