Android基础查缺补漏之UI控件
2016-06-07 14:43
302 查看
这是Android基础查缺补漏系列的第二篇,是关于UI控件的。
一、控件的对齐方式(layout_gravity)
在使用线性布局(LinearLayout)时,有些情况下给某个控件设置了对齐方式以后,却没有出现预期的效果。比如,这里有个包含Button的LinearLayout,控件的具体属性直接看代码。我想让其中的Button水平居中,但明明设置了android:layout_gravity="center_horizontal"属性却没有效果。曾经一度以为是自己没有理解layout_gravity和gravity的含义和区别(其实也没啥,一个相对于父布局,一个相对于自己而已),直到现在,我才知道并不是这个原因。
二、引入布局和简单的自定义控件
之前做的几个小App,风格基本比较一致,几乎每个Activity都有一个自己定义的标题栏(谁叫我不喜欢原生TitleBar又没怎么学过ActionBar呢)。以前的实现方式基本上是定义一个叫BaseActivity的类,其他都继承它而不再是Activity。
大多数时候,因为BaseActivity还可以抽取出一些Activity中可以重用的代码,倒也还好,但有几次,BaseActivity纯粹定义的是可以重用的界面,继承了它Activity也只好用LayoutInflate来动态填充布局。其实,完全还有另一种解决方案,那就是将需要复用的布局单独写成一个布局文件(例如下边的titlebar_layout.xml),然后用<include>标签将这个布局引入其他布局文件中。
仅仅这么做,引入布局是没问题的,但问题是布局里的的各种事件又要如何响应呢?更进一步的,我们可以将这个要引入的布局直接做成一个自定义控件。这里还不涉及自定义View所需要的覆写构造方法、onDraw()方法、onMeasur()方法等步骤,只要用一个继承任意ViewGroup(常用的LinearLayout、RelativeLayout都可以),然后同样地用LayoutInflater填充下,并实现各种事件的响应,最后再在XML布局中添加这个控件即可。这里注意填充布局时第二个参数不再是null,而是填充出来的布局要放进哪个父布局里,显然就是自定义控件本身了。
LayoutInflater.from(context).inflate(R.layout.titlebar_layout, this);
一、控件的对齐方式(layout_gravity)
在使用线性布局(LinearLayout)时,有些情况下给某个控件设置了对齐方式以后,却没有出现预期的效果。比如,这里有个包含Button的LinearLayout,控件的具体属性直接看代码。我想让其中的Button水平居中,但明明设置了android:layout_gravity="center_horizontal"属性却没有效果。曾经一度以为是自己没有理解layout_gravity和gravity的含义和区别(其实也没啥,一个相对于父布局,一个相对于自己而已),直到现在,我才知道并不是这个原因。
<?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="horizontal" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin"> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="New Button" /> </LinearLayout>事实上,当线性布局为水平方向时,只能设置垂直方向上的对齐方式,水平方向上的对齐即便设置了也不会生效,类似地可以得出垂直方向上对齐方式的设置规则。为什么会这样呢?原因是这个父布局尽管自身的大小是match_parent,但其中控件的填充方向是horizontal,即实际在水平方向上的长度是不确定的,自然也就无法指定该方向上的对齐方式,同理可得vertical方向。
二、引入布局和简单的自定义控件
之前做的几个小App,风格基本比较一致,几乎每个Activity都有一个自己定义的标题栏(谁叫我不喜欢原生TitleBar又没怎么学过ActionBar呢)。以前的实现方式基本上是定义一个叫BaseActivity的类,其他都继承它而不再是Activity。
大多数时候,因为BaseActivity还可以抽取出一些Activity中可以重用的代码,倒也还好,但有几次,BaseActivity纯粹定义的是可以重用的界面,继承了它Activity也只好用LayoutInflate来动态填充布局。其实,完全还有另一种解决方案,那就是将需要复用的布局单独写成一个布局文件(例如下边的titlebar_layout.xml),然后用<include>标签将这个布局引入其他布局文件中。
<include layout="@layout/titlebar_layout"/>
仅仅这么做,引入布局是没问题的,但问题是布局里的的各种事件又要如何响应呢?更进一步的,我们可以将这个要引入的布局直接做成一个自定义控件。这里还不涉及自定义View所需要的覆写构造方法、onDraw()方法、onMeasur()方法等步骤,只要用一个继承任意ViewGroup(常用的LinearLayout、RelativeLayout都可以),然后同样地用LayoutInflater填充下,并实现各种事件的响应,最后再在XML布局中添加这个控件即可。这里注意填充布局时第二个参数不再是null,而是填充出来的布局要放进哪个父布局里,显然就是自定义控件本身了。
LayoutInflater.from(context).inflate(R.layout.titlebar_layout, this);
<com.example.test2.TitltbarLayout android:layout_width="wrap_content" android:layout_height="wrap_content" />
相关文章推荐
- 麻雀虽小五脏俱全 Dojo自定义控件应用
- WinForm自定义控件应用实例
- Android组合控件实现功能强大的自定义控件
- C++ 自定义控件的移植问题
- C#实现用户自定义控件中嵌入自己的图标
- 百度地图自定义控件分享
- 用javascript添加控件自定义属性解析
- 详解Android自定义控件属性
- Android自定义控件深入学习 Android生成随机验证码
- 详解Android自定义控件属性TypedArray以及attrs
- Android自定义控件之圆形/圆角的实现代码
- 浅析Android手机卫士自定义控件的属性
- Android自定义控件之仿优酷菜单
- Android自定义控件实现简单写字板功能
- Android自定义控件实现简单的轮播图控件
- Android自定义表格控件满足人们对视觉的需求
- VC++ 自定义控件的建立及使用方法
- asp.net 自定义控件实现无刷新上传图片,立即显示缩略图,保存图片缩略图
- C#自定义控件添加右键菜单的方法
- asp.net DropDownList自定义控件,让你的分类更清晰