您的位置:首页 > 产品设计 > UI/UE

Android基础查缺补漏之UI控件

2016-06-07 14:43 302 查看
这是Android基础查缺补漏系列的第二篇,是关于UI控件的。

一、控件的对齐方式(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" />
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息