Activity简介:
通俗来讲是个用户界面,通常一个应用有多个activity,activity的使用会在manifest中申明,且android中是用任务栈(任务栈是一个Android应用中所有Activity的集合)来管理activity,启动时压栈退出时弹出。
当点击home键时,当前任务栈转到后台,用户可启动任意应用则此应用的任务栈处前台。
Service简介:
Service(不能理解为系统调用,service实际就是在后台默默运行的功能 例如百度云的上传下载)不直接与用户交互没有界面,但比activity有着更高的优先级可以长期存在在后台且内存紧张时不易被终止。**Service不仅可以实现后台功能还用于实现进程间通信。**使用时和activity一样需要在manifest中申明。
BroadCastReceiver简介:
猜:就是有广播发送者和接收者吧。常驻就是一直监听,非常驻则与应用程序生命周期相关。
ContentProvider简介:
内容提供器可支持在多个应用中存储和读取数据,这也是跨应用共享数据的唯一方式。在Android系统中,没有一个公共的内存区域来给各应用共享数据,而是提供了一些主要类型的contentprovider。
猜:就是各应用可通过创建Contentprovider存储自己的数据,别的应用也可以通过使用这个类来获取数据。
在安卓中所有组件都有自己的生命周期从创建到销毁。在这一过程中,组件会在活动、非活动以及可见或不可见等状态中不断因应用场景的改变而进行切换。
Activity:
Android针对Activity的管理使用的是栈机制,Activity栈保存了已经启动并且没有 终止的Activity,并遵循“先进后出”的原则。
任意时刻与用户交互的界面只有一个,而某一时刻在栈顶的也只有一个,当这个activity被销毁或有一个新的activity被创建才会改变,所以使用栈这个数据结构。
Android为我们定义了四种加载模式,分别是standard、singleTop、singleTask和singleInstance。
Activity的加载模式可以在配置文件AndroidManifest.xml中进行配置,配置项为 android:launchMode具体如下图所示:

standard 默认模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例。因此,在这种模式下,可以有多个 相同的实例,也允许多个相同Activity叠加。 例如:若我有一个Activity名为A1, 上面有一个按钮可跳转到A1。那么如果我点击按钮,便会新创一个Activity A1叠在刚才的A1上(可在同一个任务栈中存在多个相同activity),再点击,又会再新创一个在它上……点back键会依照栈顸序依次退出。
singleTop可以有多个实例,但是不允许多个相同Activity叠加。如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,否者就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例)。
singleTask(一个任务栈中只允许存在一个自己不会有重复)不允许有多个相同实例。(猜的本身应用程序)中启动的时候如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移出栈。如果栈中不存在该实例,将会创建新的实例放入栈中。
别的应用程序打开C2(singleTask的activity)时会新启动一个task。如别的应用Other中有一个activity,taskId为200,从它打开 C2,则C2的taskIdI不会为200,例如C2的taskId为201,那么再从C2打开C1、C3,则C2、C3的taskId仍为 201。
singleInstance(一个任务栈中只允许存在一个activity就是自己)一个实例activity一个task,这个task只有这个实例,不允许有别的Activity存在。
(关于在一个应用打开另一个应用的activity遵循的基本原则就是,另一个应用的activity 应该放在另一个任务栈中,遵循此原则的条件下再去遵守singleInstance还是singleTask。)
Activity生命周期
是指Activity从创建到销毁的过程,在这一过程中,Activity一般处于4种状态,即: Active/Running、Paused、Stop、Killed
(1)Active/Running 此时Activity一定处于屏幕的最前端,用户完全可以看得到,并且可以与用户进行交互。对于Activity栈来说,它处于栈顶;
(2)Paused 此时Activity在屏幕上仍然可见,但是它已经失去了焦点(一个活动被另一个非全屏的活动所覆盖(比如一个Dialog)),用户不能与之进行交互。暂停状态的Activity是存活的,它仍然维持着其内部状态信息,但是系统可能会在手机内存极低的情况下杀掉该Activity;
(3)Stop (放到后台)此时Activity在屏幕上完全不能被用户看见,也就是说这个Activity已经完全被其他Activity 所遮住。处于停止状态的Activity,系统仍然保留有其内部状态和成员信息,但是它经常会由于手机系统 内存被征用而被系统杀死回收;
(4)Killed Activity被系统杀死回收或者未启动。
回调函数:
使用者自己定义一个函数,函数的程序内容自己实现,然后把这个函数的入口地址传给别的(系统的)函数。由别的(系统的)函数运行时来调用。
Activity生命周期的回调函数(所有的Activity生命周期方法的实现都必项先调用其父类的方法。例如:public void onPause()
{ super.onPause();
. . .
}
):
void onCreate(Bundle savedInstanceState) //所有activity必须实现,用于做一下初始化工作。在Activity第一次被创建的时候调用。可在此处做初始化设置──创建视 图、绑定数据至列表等。如果曾经有状态记录,则调用此方法时会传入一个 表示Activity以前状态的包对象做为参数(就是浏览器可选择恢复原页面)。
void onStart()
void onRestart()
void onResume()
void onPause() //当系统将要启动另一个Activity活着弹出对话框时调用。此方法主要用于将所有持久性数据写入存储中,这一切动作应该在短时间内完成,因为 下一个Activity必须等到此方法返回后才会继续。onstop则可以等下一个activity resume后在来完成。
void onStop() //当Activity不再为用户可见时调用此方法。这可能发生在它被销毁戒者 另一个Activity(可能是现存的或者是新的)转到运行状态并覆盖它时。
void onDestroy() //在Activity销毁前调用,这可能发生在Activity结束(调用了它的 finish() 方法)或者因为系统需要临时空间而销毁杀死该Activity实例时。可以用 isFinishing()方法来区分这两种情况。
Android生命周期可分为全生命周期(从creat到destroy 活着)、可视生命周期(从start到stop 可被看见)、前台生命周期 (从resume到pause 可与用户交互)
注意pause可以直接resume但stop得先restart再start。
还有两个方法不属于生命周期方法不总是会被调用。
onSaveInstanceState()//Android系统在资源不足而终止Activity前被调用(有时认为按home键stop前也会使用,或者有时也直接用在pause和stop两个回调函数之间),用以保存Activity的状态信息,供onCreate()和 onRestoreInstanceState()方法恢复使用。
onRestoreInstanceState()//恢复onSaveInstanceState()保存的Activity状态信息,在onStart()和onResume()方法间使用。
还需注意:activity之间切换时无论就是暂停还是停止或者销毁,都是上一个activity先执行到onPause()就直接先让下一个activity开始create到resume显示到前端,然后才在后端接着处理之前pause的activity是否需要stop还是要destroy。(onSaveInstanceState()方法有时也会直接在pause和stop方法之间被使用)
Fragment:
Fragemnt的出现就是因为屏幕变大(例如平板出现
2个不同活动界面手机需要2个activity显示但平板要显示在一个activity上),设计者想尽可能利用当前页面显示更多信息所以将一个activity界面又分为多个有生命周期回调函数的fragment。Fragment像是个小activity子activity,也有生命周期需要依附于activity存在所以其生命周期会受所依附的activity生命周期的影响。一个activity里可以有多个fragment,一个fragment也可以用于多个activity。
Fragment生命周期回调函数:
create前先绑定,destroy后再解绑
onAttach(Activity) //当Fragment与Activity发生关联时调用。从该方法开始,就可以通过 Fragment.getActivity方法获取与Fragment关联的窗口对象了,但在该方法中仍然无法操作Fragment中的控 件。
onCreateView(LayoutInflater, ViewGroup, Bundle)//创建该Fragment的视图。
onActivityCreated(Bundle)//当Activity的onCreate方法返回时调用。
onDestoryView()//与onCreateView相对应,当该Fragment的视图被移除时调用。
onDetach()//与onAttach相对应,当Fragment与Activity关联被取消时调用
静态使用fragment:
直接新建fragment文件(继承fragment必须至少重写有oncreate和onCreateView),调整对应layout。然后在activity的layoutxml文件内添加fragment组件并在其android:name项指定哪个fragment即可。
动态使用fragment:
这个才是fragment的强大之处,先把mainactivity的layoutxml文件中的fragment引用去掉,只留下最外层linearlayout层,并对此layout添加id。然后可以在activity.java文件内用java代码直接对此layout动态添加或替换成Fragment.
Mainactivity.java:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Display display = getWindowManager().getDefaultDisplay();//获得屏幕显示
if(display.getWidth()>display.getHeight())
{
getFragmentManager().beginTransaction().replace(R.id.main_layout,new Fragment1()).commit();
}else {
getFragmentManager().beginTransaction().replace(R.id.main_layout,new Fragment2()).commit();
}
}
报错Fragment1无法转换为Fragment:明明已经extends了,这种一般就是版本错误,方法内所需的fragment的版本和你继承的不同(看报错信息更改Fragment1所继承的版本即可)。
Fragment之间通信:
Fragment和Fragment之间的 通讯的桥梁就是这个FragmentManager这个类,这个类是用来管理所有的这个Fragment的,所以可以 找到任何一个所需要的Fragment类。
实际操作来说的话应该是在一个fragment中使用getActivity获得当前运行的上下文环境再.findViewById获得同一个Activity下不同Fragment内的组件信息。
例如:在fragment2内使用:
TextView textView = (TextView)getActivity().findViewById(R.id.f1textView);获取fragment1的textview。
Intent:
Intent是一个动作的完整描述,包含了产生组件、接收组件和传递数据信息。Android中提供了Intent机制来协助应用间的交互与通讯。Intent不仅可用于应用程序之间,也可用于应用程序内部 的 Activity / Service之间的交互。因此,意义:专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。
Intent由动作、数据、分类、类型、组件和扩展信息等内容组成
Action属性用于描述Intent要完成的动作:
Data属性是执行动作的URI和MIME类型(执行的目标对象)
Action和data一般匹配使用(这两个属性是最重要的):
Category属性指明一个执行Action的分类(。例如 LAUNCHER_CATEGORY 表示Intent 的接受者应该在Launcher中作为顶级应用出现;而ALTERNATIVE_CATEGORY表示当前的Intent是一系列的可选动作中的一个,这些动作可以在同一块数据上执行。):
Component属性用于指明Intent目标组件的类名称
通常(隐式)intent是根据Intent中包含的其他属性的信息,比如Action、Data/Type、Category进行查找,最终找到一个与之匹配的目标组件。但是,如果指定了Component这个属性(显式),Intent则会 直接根据组件名查找到相应的组件,而不再执行上述查找过程。指定Component属性后, Intent的其他属性都是可选的。
Extra属性用于添加一些附加信息:例如发送一个邮件,就可以通过Extra属性来添加主题 (subject)和内容(body)。这边putExtra()一些信息就可以被在那边用getExtra()取出。
根据Intent寻找目标组件时所采用的方式不同,可以将Intent分为两类:直接Intent和间接 Intent。又称为显式Intent与隐式Intent 。
显式intent:
一般就是已知组件名
直接传递到构造函数或者用set方法设置。
隐式intent(一般选择此方式,其实就有点想打开一个视频文件时你想用哪个应用打开,这些应用就像是一堆匹配隐式intent要求的activity组件):
隐式Intent,不指定具体的组件,但是它会声明将要执行的操作,从而匹配到相应的组件。这种方式通过Intent Filter过滤实现,过滤时通常根据Action、Data和Category属性进行匹配查找。 Android提供了两种生成Intent Filter的方式:一种是通过IntentFilter类生成;另一种通过在配置文件 AndroidManifest.xml中定义元素生成。
匹配原则:
标签中常用、和这些子元素(其实就是表明所处的activity的属性或是能力,如果和程序中所需intent目标组件匹配则可以将其使用)
其中属性不能为空,否则所有的Intent都会因匹配失败而被阻塞。
当发送一个隐式Intent后,系统会将它与设备中的每一个组件的过滤器进行匹配,匹配属性有Action、 Category、Data三个需要这三个属性都匹配成功过滤器中有多个则需大于等于才能唤起相应的组件。
过滤器中有多个action项时,隐式Intent中的Action属性,与组件中的某一个过滤器的Action能够匹配(如果一个过滤器声明了多个 Action属性,只需要匹配其中一个就行,就已经说明能满足要求了),那么就算是匹配成功.
过滤器中有多个category项时,过滤器的Category属性内容必须是大于或者等于隐式Intent的Category属性时候,隐 式Intent才能匹配成功。如果一个隐式Intent没有设置Category属性,那么它可以通过任何一个过滤器 的Category匹配。
过滤器中有多个data项时,用于指定组件可以执行的数据。每个Data属性都可以指定数据的URI结构(数据地址)和数据MIME类型(数据类型)。
Data匹配时候,MIME类型和URI两者都会进行匹配,匹配规则如下:
如果过滤器未声明URI和MIME类型,则只有不含URI和MIME类型的隐形Intent才能 匹配成功
如果过滤器中声明URI但是未声明MIME类型(也不能从URI中分析出MIME类型), 则只有URI与过滤器URI相同且不包含MIME类型的隐式Intent才能匹配成功
如果过滤器声明MIME类型但是未声明URI,只有包含相同MIME类型但是不包含URI 的隐式Intent才能匹配成功
如果过滤器声明了URI和MIME类型(既可以是直接设置,也可以是从URI分析出来) ,只有包含相同的URI和MIME类型的隐式Intent才能匹配成功
总结一下就是:基本隐式intent和intentfilter的这URI和MIME两个属性无论可知未知哪个都必须一模一样。
URI匹配原则:
Uri基本结构:
[scheme:][//authority][path][?query][#fragment] authority还可以细分为host和port
[scheme:][//host:port][path][?query][#fragment]
在URI中,每个组成部分都是可选的,但是有线性的依赖关系 ①如果没有scheme部分,那么host部分会被忽略 ②如果没有host部分,那么port部分会被忽略 ③如果host部分和port部分都没有,那么path部分会被忽略 当进行URI匹配时候,并不是比较全部,而是局部对比,以下是URI匹配规则。 ①如果一个URI仅声明了scheme部分,那么所有拥有与其相同的scheme的URI都会通过 匹配,其他部分不做匹配 ②如果一个URI声明了scheme部分和authority部分,那么拥有与其相同scheme和 authority的URI才能匹配成功,path部分不做匹配 ③如果一个URI所有的部分都声明了,那么只有所有部分都相同的URI才能匹配成功
实例:
在Android世界的四大组件Activity、BroadcastReceiver、Service、Content Provider中,前三个都是 通过Intent来解析进行跳转的,Intent可以说是连接这四大组件的重要桥梁。
先学习intent实现三种activity跳转:
不带参跳转:
Intent intent = new Intent(xxx.this(当前环境activity),xxx.class(目标activity));
startActivity(intent);
带参数跳转:
其实就是以键值对形式往在startActivity前往intet里面putExtra(键,值)
目标activity中直接getIntent().getExtra(键)。
带返回值的跳转:(简单来说就是跳转时的使用startActivityForResult跳转,这样在目标activity就可以使用setResult方法来返回数据,再在本activity使用onActivityResult方法接收传回的数据即可。)
在跳转的Activity端,调用 startActivityForResult(intent, 1),跳转到 下一个Activity,其中第一个参数为传入的意图对象(里面封装了目的activity类和其余信息),第二个为设置的请求码;
跳转到第二个Activity后,调用 setResult(100, intent)方法可返回上一个 Activity,其中第一个参数为结果码,第二 个为传入的意图对象;
在第一个Activity通过onActivityResult()方法获得返回的数据 得先判断是否是自己的那个请求以及请求的结果是否同意:

View类:
Android系统给开发者提供了三种设计UI的方式:使用XML文件布局(常用);使用传统的 代码布局;前两者结合使用。在介绍Android系统提供的5大布局容器和常用控件之前需 弄清两个概念:
(1)控件:继承于View类型的,可方便完成一些特殊功能的View类型。
(2)容器:继承于ViewGroup,是一种比较特殊的View类型或者控件(ViewGroup继 承于View),它存在的作用就是可以以一定的规则展示控件,下文所说的父控件指的就 是容器。只有viewGroup控件才能包含view 例如LinearLayout 里面可以有各种控件。
几种设计模式(设计模式其实就是大家在做安卓开发中发现的一些套路,根据这些套路才能开发的快和好)
组合模式,组合模式对单个对象(叶子对象)和组合对象(组合对象)具有一致性,它将对象组织到树结构中, 可以用来描述整体与部分的关系。同时它也模糊了简单元素(叶子对象)和复杂元素(容器对象)的 概念,使得客户能够像处理简单元素一样来处理复杂元素,从而使客户程序能够与复杂元素的 内部结构解耦。
适配器模式(还是有点不太懂 主要解决两个软件实体间接口不兼容的问题 应该就是用一个适配器类将接口进行转换)
意图:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的 那些类可以一起工作。
主要解决:主要解决在软件系统中,常常要将一些”现存的对象”放到新的环境中,而新环境要求的接口是现对象 不能满足的。 何时使用: 1、系统需要使用现有的类,而此类的接口不符合系统的需要。 2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类包括一些可能在将来引进的 类一起工作,这些源类不一定有一致的接口。 3、通过接口转换,将一个类插入另一个类系中。
该模式的主要优点: ① 客户端通过适配器可以透 明地调用目标接口。 ② 复用了现存的类,程序员 不需要修改原有代码而重 用现有的适配者类。 ③ 将目标类和适配者类解耦, 解决了目标类和适配者类 接口不一致的问题。 缺点:过多地使用适配器,会 让系统非常零乱,不易整体进行把握。
TextView常用的属性:
• android:id=”@+id/textView1”表示该控件的id,在布局文件中或者代码中被引用
• android:textStyle=”bold”表示TextView里面的字加粗显示
• android:layout_height=”wrap_content”表示该控件的高度为其包含内容的高度
• android:layout_width=”wrap_content”表示该控件的宽度为其包含内容的宽度
• android:text=”@string/signin” 显示的内容,这里表示存放在string.xml文件中name=signin 的文本 • android:layout_height=”40dip”设置具体的高度 • android:textColor=”#7089c0”设置文本的颜色
• android:textSize=”18sp”设置文本的大小 • android:gravity=”center_vertical”设置文本纵向居中
• android:paddingLeft=”5dip”设置内边距 • android:layout_marginTop=”5dip”设置外边距
EditText属性的大部分设置与TextView是一样的,这里仅介绍EditText与TextView不同的属性:
• android:hint=”@string/name”表示在为输入之前的提示,当EditText获得输入焦点,并输入文字 时,该文本自动消失,起提示的作用;android:singleLine=”true”表示该文本输入框不可换行输入, 只能在一行内输入文本;
• android:password=”true”表示该文本输入框是用来输入密码的,输入的文本会自动装换为“·”, 起到隐藏用户密码的作用
Android中的组件需要用一个int类型的值来表示,即为id
id属 性只能接受资源类型的值,也就是必须以@开头的值,例如,@id/abc、@+id/xyz等。 p
*@+id(一般用于添加id)就是在R.java文件里新增一个id名称,如果之前已经存在相同的id名称,那么会覆盖**之前的名称。*
*@id(一般用于指明那个部件)则是直接引用R.java文件的存在的id资源,如果不存在,会编译报错*
Button与TextView设置一样,区别在于Button可以有按键的效果和事件的监听
Button的响应方式:
匿名内部类:
匿名类是一个表达式,匿名类的语法就类似于调用一个类的构建函数 (new OnClickListener()), 除此之外,还包含了一个代 码块,在代码块中完成类的定义。
先获取,再set监听器,监听器类直接匿名定义并重写其onclick方法即为点击时希望的响应事件。
自定义监听类:
基本没差就是额外定义了一个实现了OnClickListener接口的类,把他传入setOnClickListener方法中。
由 Activity 实现 OnClickListener 接口:(这个在实际应用中使用的较多,当点击事件较多时可以减少代码量)
实际上就是Activity实现OnClickListener 接口并重写其onClick方法,在此方法内依据传入的view参数的id判断要执行哪一种点击事件。
在布局文件中添加 onClick 属性(了解即可不好用容易出错):
Xml文件中添加onclick属性对应值为方法名 并在activity中实现此方法
ImageView和textview一样,区别在于内容是个图片
多了个src属性:android:src=”@drawable/icon_refresh”
5种layout:
LinearLayout线性布局(有个小关键点就是linearLayout水平还是垂直都不会自动换行/换列,放满了还接着往屏幕外放无法显示了就。)
orientation属性:
VERTICAL 垂直 组件之间只存在上下关系
HORIZONTAL 水平 组件之间只存在左右关系
属性:
android:orientation 设置控件或者容器存放的方式
android:id 设置控件id,方便在使用时找到其引用
android:layout_width 容器的宽度,该值必须设置
android:layout_height 容器的高度,该值必须设置
android:layout_weight 该属性针对其内的子控件,存放在LinearLayout中的控件都有这 个属性,用来设置该控件或者容器占父控件或者容器的比例。
android:background 设置背景
android:clickable 是否可以响应点击事件
android:orientation 设置子控件放置方向
xmlns:android= “http://schemas.android.com/apk/res/android" 设置该值表示可以当做一个布局文件,被Android系统解释使用,每个布局 的根布局必须包含该属性,否则,系统将找不到该布局。必须放在最外层开始的的标记中
android:paddingLeft 设置该layout的左内边距,该值设置后,位于该layout中的View或者 ViewGroup均在padding的距离内放置,边距内不能放置控件。
android:paddingRight 设置该layout的右内边距,同上
android:paddingTop 设置该layout的上内边距,同android:paddingLeft
android:paddingBottom 设置该layout的下内边距,同上
android:padding 设置该layout的四个方向内边距,同上
android:layout_margin 表示外边距,还有与内边距相类似的属性,分别为上,下,左,右外 边距 android:minHeight 表示该Layout的最小高度,layout_height=“wrap_content”
android:minWidth 表示该Layout的最小宽度,Layout_width=“wrap_content”
RelativeLayout相对布局
相对布局,是指利用控件之间的相对位置关系来对布局进行放置。换句话说, 在该容器中的控件与其他任何一个控件或者容器(包括父控件)有相对关系。
属性:
android:layout_alignParentTop=”true|false”是否与父控件顶部齐平
android:layout_alignParentBottom=”true|false” 是否与父控件底部齐平
android:layout_alignParentLeft=”true|false” 是否与父控件左部齐平
android:layout_alignParentRight=”true|false” 是否与父控件右部齐平
android:layout_centerInParent=”true|false” 是否在父控件中间
android:layout_centerInHorizontal=”true|false” 是否水平方向在父控件的中间
android:layout_centerInVertical=”true|false” 是否垂直方向在父控件的中间
android:layout_alignTop=”@id/xxx” 与xxx的顶部平齐xxx(代表控件或者容器的ID,可以 是父控件的ID)
android:layout_alignBottom=”@id/xxx” 与xxx的底部平齐
android:layout_alignLeft=”@id/xxx” 与xxx的左边平齐
android:layout_alignRight=”@id/xxx” 与xxx的右边平齐
android:layout_above=”@id/xxx” 在xxx的上面,该控件的底部与xxx顶部平齐
android:layout_below=”@id/xxx” 在xxx的下面,该控件的顶部与xxx顶部平齐 android:layout_toRightOf=”@id/xxx” 在xxx的右边,该控件的左边与xxx的右边平齐 android:layout_toLeftOf=”@id/xxx” 在xxx的左边,该控件的右边与xxx的左边平齐
FrameLayout(了解即可其实是层叠布局)
帧布局,是指该容器内放置的控件或者容器没有上下左右的关系,只有层叠前后的关系。对于放置前后的关系,在没有设置其他属性之前,默认Android系统采用的是叠放的原则,即后加入节点的层叠在上面。设置属性android:bringToFront=“true|false”将前面放置的控件提到最前面可见。
TableLayout(感觉就有点奇怪应该不常用 继承自linearlayout):
表格布局 直接往tablelayout里面放部件会直接占满一整行,此时就需要使用tableRow属性将其包裹,则一个tablerow包裹的算是一行。
一个tablerow里包含太多部件
一行放不下会直接不显示。
属性:
以下属性都是针对所有行的对应列共同的设置,编号从0开始。
android:stretchColumns=”” 设置可伸展的列(前提是得有剩余空间)(此时列的宽度由所有行中最宽的单元格决定)。该列能够向行方向伸展。最多可占领一整行。 android:stretchColumns=”0” 第0列可伸展 。
android:shrinkColumns=”” 设置可收缩的列(前提是有组件未显示完全)。android:shrinkColumns=”1,2” 第1,2列皆可 收缩
android:collapseColumns=”” 隐藏指定的列,可设置多个值,用逗号隔开“0,2”表示隐藏第1和第 3列。android:collapseColumns=”*” 隐藏全部行
AbsoluteLayout(很少使用)
绝对布局,是指以屏幕左上角为坐标原点(0,0),控件在容器中的位置以坐标的形式存在, 可以随意指定控件的坐标位置,非常灵活。在开发过程中很少使用,原因是屏幕兼容性不好,不便控制两个控件之间的位置。其中控件或者容器放置的位置通过android:layout_x和 android:layout_y这两个属性进行设置。
Res文件夹下如何存放资源文件: