Android学习的第二周笔记

来源:互联网 发布:大学生就业情况数据 编辑:程序博客网 时间:2024/05/16 14:21

1. Android布局

(1)线性布局(LinearLayout):按照垂直或者水平方向布局的组件。

这种布局比较常用,也比较简单,就是每个元素占一行,当然也可能声明为横向排放,也就是每个元素占一列。

LinearLayout按照垂直或者水平的顺序依次排列子元素,每一个子元素都位于前一个元素之后。如果是垂直排列,那么将是一个N行单列的结构,每一行只会有一个元素,而不论这个元素的宽度为多少;如果是水平排列,那么将是一个单行N列的结构。如果搭建两行两列的结构,通常的方式是先垂直排列两个元素,每一个元素里再包含一个LinearLayout进行水平排列。

LinearLayout中的子元素属性android:layout_weight生效,它用于描述该子元素在剩余空间中占有的大小比例。加入一行只有一个文本框,那么它的默认值就为0,如果一行中有两个等长的文本框,那么他们的android:layout_weight值可以是同为1。如果一行中有两个不等长的文本框,那么他们的android:layout_weight值分别为1和2,那么第一个文本框将占据剩余空间的三分之二,第二个文本框将占据剩余空间中的三分之一。android:layout_weight遵循数值越小,重要度越高的原则。

android:orientation="vertical"垂直线性布局,"horizontal"水平线性布局

android:gravity="top"(buttom、left、right、center_vertical、fill_vertical、center_horizontal、fill_horizontal、center、fill、clip_vertical、clip_horizontal)控制布局中控件的对齐方式。如果是没有子控件的控件设置此属性,表示其内容的对齐方式,比如说TextView里面文字的对齐方式;若是有子控件的控件设置此属性,则表示其子控件的对齐方式,gravity如果需要设置多个属性值,需要使用“|”进行组合

android:gravity 与 android:layout_gravity的区别
android:gravity是指定本元素的子元素相对它的对齐方式。
android:layout_gravity是指定本元素相对它的父元素的对齐方式。

android:layout_weight="1"通过设置控件的layout_weight属性以控制各个控件在布局中的相对大小,线性布局会根据该控件layout_weight值与其所处布局中所有控件layout_weight值之和的比值为该控件分配占用的区域。在水平布局的LinearLayout中有两个Button,这两个Button的layout_weight属性值都为1,那么这两个按钮都会被拉伸到整个屏幕宽度的一半。如果layout_weight指为0,控件会按原大小显示,不会被拉伸;对于其余layout_weight属性值大于0的控件,系统将会减去layout_weight属性值为0的控件的宽度或者高度,再用剩余的宽度或高度按相应的比例来分配每一个控件显示的宽度或高度。


(2)帧布局(FrameLayout):组件从屏幕左上方布局组件。

作为android六大布局中最为简单的布局之一,该布局直接在屏幕上开辟出了一块空白区域,当我们往里面添加组件的时候,所有的组件都会放置于这块区域的左上角;帧布局的大小由子控件中最大的子控件决定,如果都组件都一样大的话,同一时刻就只能能看到最上面的那个组件了!当然我们也可以为组件添加layout_gravity属性,从而制定组件的对其方式帧布局在游戏开发方面用的比较多。

android:foreground:设置该帧布局容器的前景图像

android:foregroundGravity:设置前景图像显示的位置


(3)表格布局(TableLayout):按照行列方式布局组件。

Tablelayout类以行和列的形式对控件进行管理,每一行为一个TableRow对象,或一个View控件。当为TableRow对象时,可在TableRow下添加子控件,默认情况下,每个子控件占据一列。 当为View时,该View将独占一行。
TableLayout的行数由开发人员直接指定,即有多少个TableRow对象(或View控件),就有多少行。TableLayout的列数等于含有最多子控件的TableRow的列数。如第一TableRow含2个子控件,第二个TableRow含3个,第三个TableRow含4个,那么该TableLayout的列数为4. 

android:stretchColumns:设置可伸展的列。该列可以向行方向伸展,最多可占据一整行。
android:shrinkColumns:设置可收缩的列。当该列子控件的内容太多,已经挤满所在行,那么该子控件的内容将往列方向显示。
android:collapseColumns:设置要隐藏的列。


(4)相对布局(RelativeLayout):相对其它组件的布局方式。

RelativeLayout是一个允许子视图相对于其他兄弟视图或是父视图显示的视图组(通过ID指定)。每个视图的位置能够指定它相对于兄弟(比如在其他视图的左边或是下边)或是父视图(这里是指相对布局容器,比如底部对齐、中间偏左)的位置。RelativeLayou是一个用于设计用户界面的强大工具,因为它能消除嵌套视图组和保持我们布局为扁平结构,这可以提高运行时性能。如果我们采用了多个嵌套的LinearLayout组,我们应该采用一个单独的RelativeLayout来替代。
第一类:属性值为true或false
android:layout_centerHrizontal 水平居中
android:layout_centerVertical 垂直居中
android:layout_centerInparent 相对于父元素完全居中
android:layout_alignParentBottom 贴紧父元素的下边缘
android:layout_alignParentLeft 贴紧父元素的左边缘
android:layout_alignParentRight 贴紧父元素的右边缘
android:layout_alignParentTop 贴紧父元素的上边缘
android:layout_alignWithParentIfMissing 如果对应的兄弟元素找不到的话就以父元素做参照物
第二类:属性值必须为id的引用名“@id/id-name”
android:layout_below 在某元素的下方
android:layout_above 在某元素的的上方
android:layout_toLeftOf 在某元素的左边
android:layout_toRightOf 在某元素的右边
android:layout_alignTop 本元素的上边缘和某元素的的上边缘对齐
android:layout_alignLeft 本元素的左边缘和某元素的的左边缘对齐
android:layout_alignBottom 本元素的下边缘和某元素的的下边缘对齐
android:layout_alignRight 本元素的右边缘和某元素的的右边缘对齐
第三类:属性值为具体的像素值,如30dip,40px
android:layout_marginBottom 离某元素底边缘的距离
android:layout_marginLeft 离某元素左边缘的距离
android:layout_marginRight 离某元素右边缘的距离
android:layout_marginTop 离某元素上边缘的距离

(5)绝对布局(AbsoluteLayout):按照绝对坐标来布局组件。

绝对定位AbsoluteLayout,又可以叫做坐标布局,可以直接指定子元素的绝对位置,这种布局简单直接,直观性强,但是由于手机屏幕尺寸差别比较大,使用绝对定位的适应性会比较差。

2.ListView



(1) Baseapater

ListView中有个内部类AdapterDataSetObserver,其OnChange()方法是通过计算Adapter来重绘ListView的。
ListView传入Adapter后,将AdapterDataSetObserver注册到Adapter,即添加到Apdater内部的DataSetObservable(链表类型),并第一次绘制ListView。
当Apapter数据源变化后,通知Adatpter notify即遍历了DataSetObserver的链表,并调用了AdapterDataSetObserver的onChange()函数,即重绘了ListView。
注意,由于Apdater内部的DataSetObservable是链表类型,所以,可以注册多个监听者,即多个ListView可以绑定同一个Adapter,数据源变化后会通知所有ListView。

 BaseAdapter最终实现的是Adapter接口,该接口即包含了最重要的几个函数:
+registerDataSetObserver(DataSetObserver observer):void//注册监听器对象oberver
+unregisterDataSetObserver(DataSetObserver observer):void//解除observer对象
+getCount():int//Adapter中数据的个数
+getItem(intposition):Object//Adapter中每个position的数据
+getItemId(int position):long
+getView(int position, View convertView, ViewGroupparent):view//每个position返回的view

BaseAdapter:BaseAdapter将注册、解除注册、通知观察者的事件都委托给了内部的成员变量DataSetObservablemDataSetObservable,而DataSetObservable mDataSetObservable对于观察者的管理是通过链表进行的。


3. Gridview

GridView(网格视图)是按照行列的方式来显示内容的,一般用于显示图片,图片等内容,比如实现九宫格图,用GridView是首选,也是最简单的。主要用于设置Adapter。

GridView常用的XML属性:

Android:columnWidth:设置列的宽度。

android:gravity:设置此组件中的内容在组件中的位置。可选的值有:top、bottom、left、right、center_vertical、fill_vertical、center_horizontal、fill_horizontal、center、fill、clip_vertical可以多选,用“|”分开。

android:horizontalSpacing:两列之间的间距。

android:numColumns:设置列数。

android:stretchMode:缩放模式。

android:verticalSpacing:两行之间的间距。


4. 自定义控件

(1)dp sp px等

dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。 
dp: dip是一样的
px: pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。
pt: point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用;
sp: scaled pixels(放大像素). 主要用于字体显示best for textsize。


(2)Inflater

获得 LayoutInflater 实例的三种方式:
LayoutInflater inflater = getLayoutInflater();  //调用Activity的getLayoutInflater()
LayoutInflater localinflater =(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LayoutInflater inflater = LayoutInflater.from(context);  

(3)View

构造器 初始化

onMeasure()

onLayout()

onDraw()

invalidate()

(4)自定义控件的三种主要形式、

  • 继承已有的空间来实现自定义控件
  • 通过继承一个布局实现自定义控件
  • 通过继承view类实现自定义控件

4. Fragment


Android运行在各种各样的设备中,有小屏幕的手机,超大屏的平板甚至电视。针对屏幕尺寸的差距,很多情况下,都是先针对手机开发一套app,然后拷贝一份,修改布局以适应什么超级大屏的。难道无法做到一个app可以同时适应手机和平板吗?答案是,当然有,那就是Fragment.Fragment出现的初衷就是为了解决这样的问题。
你可以把Fragment当成Activity一个界面的一部分,甚至Activity的界面由完全不同的Fragment组成,更帅气的是Fragment有自己的声明周期和接收、处理用户的事件,这样就不必要在一个Activity里面写一堆事件、控件的代码了。更为重要的是,你可以动态的添加、替换、移除某个Fragment。

  • Fragment相当于模块化的一段activity
  • 具有自己的生命周期,接受自己的条件
  • 在activity运行时被添加或删除
Fragment比Activity多了几个额外的生命周期回调函数:
onAttach(Activity);  //当Activity与Fragment发生关联时调用
onCreateView(LayoutInflater,ViewGroup,Bundle);  //创建该Fragment的视图
onActivityCreate(bundle);  //当Activity的onCreate();方法返回时调用
onDestoryView();  //与onCreateView相对应,当改Fragment被移除时调用
onDetach();  //与onAttach()相对应,当Fragment与Activity的关联被取消时调用
注意:除了onCreateView,其他的所有方法如果你重写了,必须调用父类对于该方法的实现。

为back stack加上监听器:addOnBackStackChangedListener()

用FragmentManager可以做的工作有:

  • 得到Activity中存在的fragment:使用findFragmentById()或findFragmentByTag()方法。
  • 将fragment弹出back stack:popBackStack():将back stack中最后一次的fragment转换弹出。如果没有可以出栈的东西,返回false。
  • 这个函数是异步的:它将弹出栈的请求加入队列,但是这个动作直到应用回到事件循环才会执行



5. 其他

(1) 减少布局的层次

  • 控制在10层内
  • 减少层次
  • 删除无用布局
  • 布局结构清晰
  • 选择合适的布局

0 0
原创粉丝点击