Android基础查缺补漏之UI控件

这是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" />

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值