1.Activity
2.Broadcast Intent Receiver
3.Service
4.Content Provider
AndroidManifext.xml --- 清单文件 --- 配置上面的4类组件名称 和 权限信息
1.Activity: --- 屏幕上的显示 --- 类似于 网页(Activity) 之于 浏览器(Android系统)
当打开新的屏幕,之前的屏幕会被置为暂停状态,并压入历史堆栈中,用户可以通过回退操作返回到之前的屏幕,
也可以选择性的移除一些没用的屏幕,Android会把每个应用从开始到当前的每个屏幕保存在堆栈中。
2.Intent和Intent Filters:
Intent:官方--一个Intent就是一次对将要执行的操作的抽象描述
An Intent is an abstract descrition of an operation to be performed.
Intent最基础的作用 -- 通过Intent在多个Activity之间跳转,并将数据传递 --- Intent(Context, targetActivity.class)
Intent最重要的部分 -- 动作Action和Action对应的数据Data
典型的动作类型:MAIN(Activity的门户),VIEW,PICK,EDIT等。
动作对应的数据以URI形式表示
例:查看某人联系方式, 1.创建一个动作类型为VIEW的Intent 2.创建一个表示这个人的URI
Android的界面布局:
1.LinearLayout:元素按照一个方向排列
水平 --- android:orientation="vertical" 从左往右排列
垂直 --- android:orientation="vertical" 从上网下排列
2.FrameLayout --- 类似于屏幕上的一个空白区域,里面可以放组件或图片,
所有的元素都放置在FrameLayout的最左上方区域,无法为这些元素制定确切位置,
多个元素的话,后放置的元素会重叠在前一个元素上。
3.RelativeLayout:元素按照相对位置进行排列,可以设置一个元素的位置或在相对于其他元素的位置
例:
1.取消按钮和容器右边对齐,请设置左边的边距为10dip
android:id="@+id/cancel"
android:layout_alignParentRight="true"
android:layout_marginLeft="10dip"
2.确定按钮在取消按钮左侧,并且和取消按钮同高
android:id="@+id/ok"
--在cancel左侧 android:layout_toLeftOf="@id/cancel"
--和cancel同高 android:layout_alignTop="@id/cancel"
4.TableLayout --- 类似于html中的table表格式布局,以行列进行排列
5.LayoutParams
LayoutParams继承于Android.View.ViewGroup.LayoutParams.
LayoutParams相当于一个Layout的信息包,它封装了Layout的位置、高、宽等信息。假设在屏幕上一块区域是由一个Layout占领的,如果将一个View添加到一个Layout中,最好告诉Layout用户期望的布局方式,也就是将一个认可的layoutParams传递进去。
可以这样去形容LayoutParams,在象棋的棋盘上,每个棋子都占据一个位置,也就是每个棋子都有一个位置的信息,如这个棋子在4行4列,这里的“4行4列”就是棋子的LayoutParams。
但LayoutParams类也只是简单的描述了宽高,宽和高都可以设置成三种值:
1,一个确定的值;
2,FILL_PARENT,即填满(和父容器一样大小);
3,WRAP_CONTENT,即包裹住组件就好。
在JAVA中动态构建的布局,常常这样写:
setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
上面这一句话其实是子对父的,也就是说,父布局下的子控件要设置这句话。
因为布局很多,虽然都继承至ViewGroup但是各个布局还是有很大的不同。
很显然上面这句应该这样写才算准确:
setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT,TableRow.LayoutParams.FILL_PARENT));
这表示这个子控件的父布局是一个TableRow , 这样的LayoutParams 太多,所以应明确指明。
下面分别说下两个常用到布局:
1. FrameLayout下动态设置子控件居中,动态用JAVA代码要这样实现:
FrameLayout.LayoutParams lytp = new FrameLayout.LayoutParams(80,LayoutParams.WRAP_CONTENT);
lytp .gravity = Gravity.CENTER;
btn.setLayoutParams(lytp);
2. RelativeLayout下动态设置子控件居中:
RelativeLayout.LayoutParams lp=new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);
lp.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
btn1.setLayoutParams(lp);
LayoutParams封装了Layout的高,宽等信息,假设一个区域由一个Layout占领,如果将一个View添加到Layout中,需要告诉Layout用户期望的布局方式,
即将一个认可的LayoutParams传递进去。
LayoutParams描述的宽高的值可以设置为下边2个值中的任何一种:一个确定的值;
FILL_PARENT,即View希望和父容器一样大;
WRAP_CONTENT,指当前的View的大小只需要包裹住View里面的内容即可。
Java代码
private LinearLayout layout;
layout = (LinearLayout)findViewById(R.id.layout);
TextView view = new TextView(Activity01.this);
view.setText("Text View");
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
layout.addView(view,params);
6.LayoutInflater的作用
LayoutInflater这的作用类似于findViewById()。不同点是:
LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化为View类对象。对于一个已经载入的界面,就可以使用Activiyt.findViewById()方法来获得其中的界面元素,因为在一个Activity里对应的是setConentView()的那个layout里的组件。
通俗的说,inflate就相当于将一个xml中定义的布局找出来。因此如果你的Activity里如果用到别的layout,比如对话框上的layout,你还要设置对话框上的layout里的组件(像图片ImageView,文字TextView)上的内容,你就必须用inflate()先将对话框上的layout找出来,然后再用这个layout对象去找到它上面的组件,所以对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来载入。
获得 LayoutInflater 实例的三种方式
LayoutInflater inflater = getLayoutInflater();//调用Activity的getLayoutInflater() LayoutInflater inflater = LayoutInflater.from(context); LayoutInflater inflater = (LayoutInflater)context.getSystemService (Context.LAYOUT_INFLATER_SERVICE); |
四种加载方式
public View inflate (int resource, ViewGroup root) public View inflate (XmlPullParser parser, ViewGroup root) public View inflate (XmlPullParser parser, ViewGroup root, boolean attachToRoot) public View inflate (int resource, ViewGroup root, boolean attachToRoot) |
示意代码:
View view = LayoutInflater.from(mContext).inflate(R.layout. pic_layout, null, false); LinearLayout forward = (LinearLayout)view.findViewById(R.id. pic_bottom_layout); TextView textView = (TextView) left_convertView.findViewById(R.id.chat_time); |
Java代码
LayoutInflater inflate = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);//LayoutInflater需要通过getSystemService方法来获得,而不能直接实例化
RelativeLayout layoutLeft = (RelativeLayout) inflate.inflate(R.layout.left, null);//调用inflate方法将left.xml进行解析,并生成一个RelativeLayout布局