android静态,二.Android静态和动态布局

android将布局与具体操作分为xml文件和java文件,xml文件主要负责布局,但是xml文件完成的所有任务java文件都是可以完成的,并且解析xml文件也是需要资源的,只不过google推荐这样使用,一是为了界面和逻辑分离,二是xml的逻辑控制很方便。所以牺牲一点资源来解析xml文件是可取的。

我将其分为静态布局和动态布局(也可以称为交互),静态布局直接加载,方便查看和修改。动态布局需要代码控制,用户体验好。

开始一个项目之前,要想好静态布局和动态布局的分布,一句话,能在xml文件中做的事,一定不要放在java里做。

1.静态布局

1.1 View和ViewGroup

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

8874fd8b240b

静态布局树状图

View是所有的UI组件都要继承并实现的,一个View要在屏幕上占据一块矩形区域。

ViewGroup是一个容器,可以将View添加进ViewGroup中,ViewGroup可以对其内的View进行布局,ViewGroup可以添加其他的ViewGroup。

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

1.2 xml基本属性

1.2.1 xml文件声明

这是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图层的样子。

8874fd8b240b

1.3.5 TableLayout

表格布局,顾名思义,就是一个表格。

它遵循着以下结构:

还有几个重要属性:

写在TableLayout中的属性

android:stretchColumns 设置第几列为伸展(0表示第一列)

android:shrinkColumns 设置第几列为收缩

android:collapseColumns 设置第几列为隐藏

写在TableRow里的控件里的属性

android:layout_column 设置控件在第几列

android:layout_span 设置控件能跨多少列

下面是一个例子:

android:stretchColumns="0"

android:shrinkColumns="1"

android:collapseColumns="2">

android:text="我要在第2列"

android:layout_column="1"/>

android:text="我要 跨 两 列"

android:layout_column="0"

android:layout_span="2">

8874fd8b240b

1.3.6 AbsoluteLayout

绝对布局,已经被淘汰了的布局。

所有控件都要设置x,y坐标,使用绝对的布局。

android:layout_x //控件x坐标

android:layout_y //控件y坐标

1.4 控件

1.4.1 android自带控件

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

8874fd8b240b

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);

}

}

);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值