二.Android静态和动态布局

android将布局与具体操作分为xml文件和java文件,xml文件主要负责布局,但是xml文件完成的所有任务java文件都是可以完成的,并且解析xml文件也是需要资源的,只不过google推荐这样使用,一是为了界面和逻辑分离,二是xml的逻辑控制很方便。所以牺牲一点资源来解析xml文件是可取的。
我将其分为静态布局和动态布局(也可以称为交互),静态布局直接加载,方便查看和修改。动态布局需要代码控制,用户体验好。
开始一个项目之前,要想好静态布局和动态布局的分布,一句话,能在xml文件中做的事,一定不要放在java里做。

1.静态布局

1.1 View和ViewGroup

静态布局都是由View和ViewGroup继承而来。


静态布局树状图
  • View是所有的UI组件都要继承并实现的,一个View要在屏幕上占据一块矩形区域。
  • ViewGroup是一个容器,可以将View添加进ViewGroup中,ViewGroup可以对其内的View进行布局,ViewGroup可以添加其他的ViewGroup。

所有的控件都是从View继承而来,ViewGroup是View的一个重要子类,绝大多数布局都是从ViewGroup继承而来。

1.2 xml基本属性

1.2.1 xml文件声明

  <?xml version="1.0" encoding="utf-8"?>

这是xml的声明和编码格式,删掉也是可以,但是一般都会保留,并且编码有时候也是需要注意的。

1.2.2 xml文件命名空间

  xmlns:android="http://schemas.android.com/apk/res/android"

xmlns是xml namespace 的简写,是引用命名空间。
这类似于c++ using namespace std,这个必须在最外层的Layout进行声明。因为只有在这个命名空间内,android:layout_width 才会有意义。因为在这个命名空间内,android:layout_width是被定义过的,只需要拿来引用即可。
当然,xml命名空间是可以自定义的。至于为什么要有命名空间,是为了区别不同部分相同元素。详细可以查查xml的命名空间。此处因重心在android,点到为止。

1.2.3 layout属性

android:layout_width=""
android:layout_height=""

一横一竖,确定 了layout的大小。
一共有2种填法:

  • 属性填法
    • fill_parent 和match_parent是填充满整个父空间。
    • wrap_content而是自适应大小,随着内容的多少进行扩大。
  • 数值填法
    • dp、dpi:是动态适应所有分辨率的单位,会随着屏幕大小的改变而改变。
    • px:是设计师常用的像素,不会随着屏幕大小的改变而改变。

这样,xml文件基本就可以运行了。

xml文件基本要素:命名空间layout属性

1.3 六大布局

1.3.1 LinearLayout

line是线的意思,linear是线性的意思,这个布局就是线性布局。只能横着排,或者只能竖着排。
关键属性是orientation,这个是方向的意思。
这个有两个选项 vertical,horizontal。是不是觉得太长记不住呢,有一个简便的记忆方法,利用IDE的自动提示功能,只要记住第一个字母就可以了对吧,可以把h记作横(heng)这样就不会错了。

1.3.2 RelativeLayout

relative是相对的意思,这个布局是相对布局。
相对布局就是依据父元素和某元素进行相对布局。
有三种类型的属性:

  • 属性值是true或false
    • android:layout_centerHrizontal 水平居中
    • android:layout_centerVertical 垂直居中
    • android:layout_centerInparent 相对于父元素完全居中。
    • android:layout_alignParentBottom 位于父元素的下边缘
    • android:layout_alignParentTop 位于父元素的上边缘
    • android:layout_alignParentLeft 位于父元素的左边缘
    • android:layout_alignParentRight 位于父元素的右边缘
  • 属性值是"@id/*“
    • android:layout_below 在某元素的下方
    • android:layout_above 在某元素的上方
    • andorid:layout_toRightOf 在某元素的右方
    • android:layout_toLeftOf 在某元素的左方
    • android:layout_alignBottom 和某元素下方对齐
    • android:layout_alignTop 和某元素上方对齐
    • android:layout_alignRight 和某元素右方对齐
    • android:layout_alignLeft 和某元素左方对齐
  • 属性值是数值
    • android:layout_marginLeft 离某元素左边缘的距离
    • android:layout_marginRight 离某元素右边缘的距离
    • android:layout_marginTop 离某元素上边缘的距离
    • android:layout_marginBottom 离某元素下边缘的距离

上面这两种是最常用的两种布局,基本能完成一些基本的布局了。

1.3.3 自定义布局

自定义是对ViewGroup进行继承,一般要实现以下方法:

  • 重写onMeasure()方法对子View进行测量。在onMeasure中计算childView的测量值以及模式,以及设置自己的宽和高。
  • 重写onLayout()方法确定子View的位置,对所有childView进行定位(设置childView的绘制区域)。

自定义ViewGroup是很有必要的,因为当官方给出的空间无法满足自己的需求时,就需要自己取定义一种布局了。

1.3.4 FrameLayout

框架布局,第一个控件放在最底层的左上角,然后后面的控件在左上角一层一层的覆盖上去。类似于Ps图层的样子。


1.3.5 TableLayout

表格布局,顾名思义,就是一个表格。
它遵循着以下结构:

<TableLayout>
    <TableRow>
    <!-在这里填充第一行的元素->
    </TableRow>
    <TableRow>
    <!-在这里填充第二行的元素->
    </TableRow>    
</TableLayout>

还有几个重要属性:

  • 写在TableLayout中的属性
    • android:stretchColumns 设置第几列为伸展(0表示第一列)
    • android:shrinkColumns 设置第几列为收缩
    • android:collapseColumns 设置第几列为隐藏
  • 写在TableRow里的控件里的属性
    • android:layout_column 设置控件在第几列
    • android:layout_span 设置控件能跨多少列

下面是一个例子:

<TableLayout ……
    android:stretchColumns="0"
    android:shrinkColumns="1"
    android:collapseColumns="2">
  <TableRow>
      <TextView android:text="我是伸展的第一列"/>
      <TextView android:text="我是收缩的第二列"/>
      <TextView android:text="我被隐藏了"/>
  </TableRow>
  <TableRow>
      <TextView android:text="我可以伸展的很长很长很长长"/>
      <TextView android:text="我可以收缩,我可以变的很深很深很深"/>
      <TextView android:text="我被隐藏了T_T"/>
  </TableRow>
  <TableRow >
    <TextView 
         android:text="我要在第2列"  
         android:layout_column="1"/>
   </TableRow>
<TableRow ……>
 <TextView 
       android:text="我要                  跨                  两                    列"
         android:layout_column="0"  
         android:layout_span="2">
   </TableRow>
</TableLayout>

1.3.6 AbsoluteLayout

绝对布局,已经被淘汰了的布局。
所有控件都要设置x,y坐标,使用绝对的布局。

android:layout_x //控件x坐标
android:layout_y //控件y坐标

1.4 控件

1.4.1 android自带控件

来一张大图,控件继承类。


1.4.2 自定义控件

自定义控件有三种方法:

  • 对现有控件进行扩展
    继承控件后重写onDraw()方法,在回调父类方法前实现自己的逻辑。
  @Override
  protected void onDraw(Canvas canvas){
      //在回调之前实现自己逻辑。
      super.onDraw(canvas);
      //在回调之后实现自己逻辑。
}
  • 通过组合来实现新的控件
  • 重写View来实现全新的控件

2 动态布局

2.1 用类修改xml

这是一种最简单的动态布局了,可以使用findViewById找到想要进行接管的控件,然后再修改其中的属性,然后达到动态的目的。

2.2 动态生成

首先创建一个布局管理器,然后使用setContentView()将布局管理器绘制出来,之后再用addView()方法加入控件元素。

LinearLayout linearLayout=new LinearLayout(this);
setContentView(linearLayout);

linearLayout.setOrientation(LinearLayout.HORIZONTAL);

TextView txt=new TextView(this);
tvSecond.setText("这是变身前");
Button btn=new Button(this);
btNext2.setText("变身");

linearLayout.addView(txt);
linearLayout.addView(btn);

btn.setOnClickListener(new OnClickListener(){
    public void onClick(View view){
        //这次只放置一个TextView不需要布局管理器
        TextView tv3=new TextView(Show.this);
        tv3.setText("我是变身后");
        //直接让页面显示一个TextView
        setContentView(tv3);
         }
    }
);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,568评论 25 707
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,201评论 0 17
  • 欢迎Follow我的GitHub, 关注我的CSDN. 其余参考Android目录. 转载请注明出处:http:/...
    passiontim阅读 4,697评论 0 31
  • 一、时间管理100天目标 从懵懂无知到慢慢摸索,踏上时间管理的新旅途,每次的决定都是经过深思熟虑的践行,100天的...
    瑜伽朵儿阅读 189评论 0 0
  • 今天注册成功了简书,希望在这个平台里学习到更多东西,接触到更多朋友,把荒废了这许多年的写作重新拾起来。描写酸甜苦辣...
    山东马哥阅读 110评论 0 1