appears as a floating view over the application. It will never receive focus.Activity学习:
一、Activity认识
Activity是用户与Android应用程序交互的接口,用户操作应用程序都是通过Activity完成的,这只是一种抽象的定义方式。在Activity中可以放置各种控件,如TextView,Button等,又可以把它看作是一个控件容器。
二、创建Activity以及运行Activity的步骤
1、一个Activity其实就是一个类,这个类继承于Activity。
2、需要覆盖onCreate(Bundle savedInstanceState)方法,该方法在Activity第一次运行时,Activity框架会调用这个方法。
3、由于Activity是Android应用程序的一个组件,所以每一个Activity都需要在android的配置文件AndroidManifest.xml中进行配置。
4、为Activity添加必要的控件,如何添加呢?在layout文件夹中创建一个声明一个xml格式的布局文件,然后再在这个布局文件中对Activity的布局以及不同的控件进行设置。
5、再在第一步定义的Activity子类中通过findViewById(R中对应的id类中控件的id)方法来获取布局文件中声明的控件,前提是布局文件中必须声明这些控件的id.
三、多个Activity之间的关系
Activity之间可以传递数据,而且Activity不仅仅必须在同一个应用程序内,也可以在不同的应用程序之间。使用startActivity(Intent intent)来执行另外一个Activity,其中intent是很关键的,它象征了请求,其中包含了请求执行的动作,携带的数据等等信息。
四、Intent的作用
可以把Activity理解为一个请求,其中包含了以下一组信息:
Component name: 请求的组件的名称
Action: 组件拿到intent后执行的动作
Data: Activity之间或者是和别的应用程序之间传递的数据
Category
Extras: 一些额外的信息,它们都是键值对
Flags
Intent的setClass(page1.this, page2.class);其中第一个参数是启动Intent的Activity,第二个参数是被启动的Activity。
onClickListener 点击行为监听器,和Swing中的监听器类似,可以作为Activity的内部类或者是匿名类定义,复写其中的onCreate()方法。
- public class Activity02 extends Activity { /** Called when the activity is first created. */
- //代表按钮对象的引用
- private Button myButton = null;
- //复写父类当中的onCreate方法,Activity第一次运行时会调用这个方法
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState); //为Activity设置布局管理文件
- setContentView(R.layout.main); //以下两行代码是根据控件的ID来得到控件对象
- myButton = (Button)findViewById(R.id.myButton); //为按钮对象设置监听器对象
- myButton.setOnClickListener(new MyButtonListener()); } //以下是一个内部类,这个内部类的对象是一个监听器(如果大家对监听器不是很熟悉,可以参考设计模式当中的观察者模式)
- class MyButtonListener implements OnClickListener{
- //生成该类的对象,并将其注册到控件上。如果该控件被用户按下,就会执行onClick方法
- @Override
- public void onClick(View v) {
- //生成一个Intent对象
- Intent intent = new Intent();
- //在Intent对象当中添加一个键值对
- intent.putExtra("testIntent", "123");
- //设置Intent对象要启动的Activity
- intent.setClass(Activity02.this, OtherActivity.class);
- //通过Intent对象启动另外一个Activity
- Activity02.this.startActivity(intent);
- /**以下的4行代码将启动发送短信的Activity,详细的情况会在以后的课程当中进行介绍
- Uri uri = Uri.parse("smsto://0800000123");
- Intent intent = new Intent(Intent.ACTION_SENDTO, uri);
- intent.putExtra("sms_body", "The SMS text");
- startActivity(intent); */
- }
- }
- }
五、在一个Activity中启动另外一个Activity的方法
利用startActivity(Intent intent)方法启动另外一个Activity
六、使用Intent在Activity之间传递数据的基本方法
使用Intent的putExtra("key", "value")方法来传递,在对应的Activity中利用getStringExtra("key")来取得值,当然首先要getIntent()得到从另外一个Activity中传递过来的Intent对象。
七、常见的Activity控件
1、EditText:类似于html中的文本输入框,用户在其中输入文本
2、TextView:显示文本的控件
3、Button:按钮
4、Menu:菜单控件
前面三个都需要在Activity对应的布局文件中进行注册,而Menu控件不需要在布局文件中进行注册。
public boolean onCreateOptionsMenu(Menu menu) 当用户点击MENU按钮的时候会调用该方法,因此如果想实现点击MENU按钮弹出一个菜单就需要复写该方法。
通过调用add(int groupId, int itemId, int order, int titleRes)
来添加菜单项,该方法返回的结果是MenuItem,注意该方法的四个参数,第一个是组id,第二个是菜单项id,第三个是顺序id,最后一个是菜单项的值,这个值应该定义在string.xml中,方便实现国际化。
那么当用户选择了某个菜单项的时候又怎么办呢?
复写public boolean onOptionsItemSelected(MenuItem item)方法,在方法中利用getItemId()方法来判断用户点击的MenuItem(利用ItemId)是哪个,并执行相应的操作。
结束程序执行时,调用Activity的finish()就可以了。
5、RadioGroup和RadioButton
顾名思义,RadioButton即单选按钮,多个RadioButton是属于同一个RadioGroup的,因此在布局文件中,RadioButton标签是作为RadioGroup的子元素存在的。RadioGroup也可以配置orientation,即其中的radioButton的排列方式。
在Activity中,如果需要对RadioGroup和RadioButton添加监听器,需要对RadioGroup对象添加监听器,通过调用:
genderGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() //匿名内部类
来为当前的RadioGroup添加监听器,监听后执行的操作需要继承RadioGroup的内部类OnCheckedChangeListener,并且复写public void onCheckedChanged(RadioGroup group, int checkedId)方法。调用RadioButton对象的getId()和checkedId来进行比较,判断点击的是哪个RadioButton。
6、CheckBox
和RadioButton不一样,checkBox表示复选框,它没有组的概念在里面,在为checkBox设置监听器的时候,需要为每个CheckBox都设置一个监听器,而不是像RadioButton那样,只为RadioGroup设置监听器。通过调用CheckBox对象的setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {来添加监听器。它是复写的CompoundButton的内部类OnCheckedChangeListener的public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)来实现的。CheckBox继承于compoundButton。其中isChecked顾名思义,表示是否选中,根据此值再来完成相应地操作。
7、Toast
A toast is a view containing a quick little message for the user.简单翻译Toast就是一个包含了提醒用户的信息的一个视图。appears as a floating view over the application. It will never receive focus.Toast视图是漂浮在别的Activity之上的,而且它永远不能获得焦点。
调用Toast的静态方法
public static Toast makeText(Context context, CharSequence text, int duration)
来添加一个Toast,该Toast展示的结果是text中的值,duration表示该Toast显示的时间。
8、ProgressBar
顾名思义,该控件指的是进度条控件, 进度条在布局文件中进行配置,其中通过设置ProgressBar的style属性来选择不同的进度条:
style="?android:attr/progressBarStyleHorizontal" 水平进度条
style="?android:attr/progressBarStyle" 普通进度条
通过设置visibility属性来设置进度条是否可见:
android:visibility="gone" //不可见,具体的可见性在Activity中进行设置
对于水平进度条,还可以在布局文件中设置进度条的max属性,指定进度条的基数:
android:max="100"
在Activity中可以调用进度条对象的setVisibility(View.VISIBLE)来设置进度条是否可见,也可以调用setMax()来设置水平进度条的基数。另外,还可以调用进度条的
setProgress(int progress) 来设置主进度条的位置,进度条的位置位于:progress/max(max是水平进度条的基数)
setSecondaryProgress(int secondaryProgress) 用来设置第二进度条的当前位置,原理同上面的方法。
9、ListView
八、Activity的生命周期
public class Activity extends ApplicationContext {
protected void onCreate(Bundle savedInstanceState);
protected void onStart();
protected void onRestart();
protected void onResume();
protected void onPause();
protected void onStop();
protected void onDestroy(); }
Activity中上面的七个方法代表了Activity生命周期的七个阶段,其中当Activity第一次被创建的时候会执行onCreate方法,而当Activity创建完后并且展示给用户的时候会调用onStart方法,接着如果该Activity获得焦点将会由Android系统调用该Activity的onResume方法,接下来,如果该Activity执行了另外一个Activity,那么上一个Activity的onPause方法会被调用以执行一些资源的释放操作,接下来执行新的Activity的onCreate,onStart以及onResume方法,如果新建的Activity完全覆盖了原来的Activity,那么原来Activity的stop方法将会被调用。而当从新建的Activity中会到原来的Activity时onRestart方法会被调用,并连续执行onStart()以及onResume(),此时不会再执行onCreate(),因为该Activity并未被销毁,如果在Activity中执行了finish()或者Android系统需要回收资源时可能会执行Activity的onDestroy()。
注意,在Activity的执行过程中,存在一个Task的概念,Task其实就是一个Activity栈,先进后出,其中首先执行的Activity入栈,接下来执行的Activity继续入栈,如果Activity执行了finish(),将不会被放入Task栈中,新的Activity入栈的时候,上一个Activity会执行onPause(),接下来是刚入栈的Activity的onCreate,onStart,onResume方法,接下来可能会执行上一个Activity的onStop方法,当从Task栈中弹出Activity的时候,会首先执行上一个弹出的Activity的onPause(),接着执行当前Activity的onRestart(),onStart()以及onResume(),再执行上一个弹出的Activity的onStop()以及onDestroy()。弹出的Activity若要再次被执行,即进入Task栈,需要再次执行onCreate来创建它,因为此时它已经被销毁,不能再onRestart了。
即从Task栈中弹出Activity时会执行将弹出的Activity给销毁掉。
android:theme="@android:style/Theme.Dialog" 设置当前Activity为弹出式的Activity,其中Task栈中前一个Activity并未被完全覆盖,因此此时只会调用前一个Activity的onpause()方法,而不会调用onStop方法。
<!--StartFragment -->
- 11-14 13:14:37.342: INFO/System.out(267): FirstActivity ---> onCreate
- 11-14 13:14:37.403: INFO/System.out(267): FirstAcvity --->onStart
- 11-14 13:14:37.413: INFO/System.out(267): FirstAcvity --->onResume
- 11-14 13:14:45.093: INFO/System.out(267): FirstAcvity --->onPause
- 11-14 13:14:45.132: INFO/System.out(267): SecondActivity--->onCreate
- 11-14 13:14:45.142: INFO/System.out(267): SecondActivity--->onStart
- 11-14 13:14:45.152: INFO/System.out(267): SecondActivity--->onResume
- <span style="color: #333333;">11-14 13:14:53.433: INFO/System.out(267): SecondActivity--->onPause
- 11-14 13:14:53.473: INFO/System.out(267): FirstAcvity --->onStop</span>
- 11-14 13:14:53.473: INFO/System.out(267): FirstActivity ---> onCreate
- 11-14 13:14:53.493: INFO/System.out(267): FirstAcvity --->onStart
- 11-14 13:14:53.493: INFO/System.out(267): FirstAcvity --->onResume
- 11-14 13:14:53.833: INFO/System.out(267): SecondActivity--->onStop
- <span style="color: #333333;">11-14 13:17:02.293: INFO/System.out(267): FirstAcvity --->onPause
- 11-14 13:17:02.323: INFO/System.out(267): SecondActivity--->onCreate</span>
- 11-14 13:17:02.342: INFO/System.out(267): SecondActivity--->onStart
- 11-14 13:17:02.352: INFO/System.out(267): SecondActivity--->onResume
<!--StartFragment -->
八、Activity的布局
(1)LinearLayout
android:orientation="vertical" ——可选horizontal 和 vertical 表示控件水平放置或者垂直放置,即横向布局和纵向布局
常见的控件属性
android:id —— 为控件指定相应的ID
android:text —— 指定控件当中显示的文字,需要注意的是,这里尽量使用strings.xml文件当中的字符串
android:grivity —— 指定控件中文字的基本位置,比如说居中,居右等位置
android:textSize —— 指定控件当中字体的大小
android:background —— 指定该控件所使用的背景色,RGB命名法
android:width —— 指定控件的宽度
android:height —— 指定控件的高度
android:padding* —— 指定控件的内边距,也就是说控件中的内容与控件边框之间的距离,可以不用指定left,right,top,bottom,直接指定padding表示四边边距。
android:margin* —— 指定控件的外边距,也就是控件边框之间的距离,可以不用指定left,right,top,bottom,直接指定margin表示四边边距。
android:layout_weight —— 控件之间的大小比例,当前控件所占的比例为:当前控件的weight/所有控件的weight之和
android:sigleLine —— 如果设置为真的话,则将当前控件的所有内容在同一行当中进行显示
(2)TableLayout
TableLayout标签本身的属性android:stretchColumns表示拉伸某一列来填满父控件的控件,例如对于TableRow来说,其中有很多控件,但是这些控件都无法让TableRow填满,此时设置了拉伸列,那么指定列将会被拉伸来填满TableRow。
TableLayout中可以包含很多的TableRow标签,TableRow标签中的每个控件占据一列,每个TableRow标签代表占据一行。
为了得到复杂的布局,各个Layout之间是可以相互嵌套的
(2)RelativeLayout 相对布局
常见控件的布局,分为四组:
android:layout_above 将该控件的底部至于给定ID的控件之上
android:layout_below 将该控件的顶部至于给定ID的控件之下
android:layout_toLeftOf 将该控件的右边缘和给定ID的控件的左边缘对齐
android:layout_toRightOf 将该控件的左边缘和给定ID的控件的右边缘对齐
android:layout_alignBaseline 该控件的baseline和给定ID的控件的baseline对齐
android:layout_alignBottom 将该控件的底部边缘与给定ID控件的底部边缘
android:layout_alignLeft 将该控件的左边缘与给定ID控件的左边缘对齐
android:layout_alignRight 将该控件的右边缘与给定ID控件的右边缘对齐
android:layout_alignTop 将给定控件的顶部边缘与给定ID控件的顶部对齐
android:alignParentBottom 如果该值为true,则将该控件的底部和父控件的底部对齐
android:layout_alignParentLeft 如果该值为true,则将该控件的左边与父控件的左边对齐
android:layout_alignParentRight 如果该值为true,则将该控件的右边与父控件的右边对齐
android:layout_alignParentTop 如果该值为true,则将空间的顶部与父控件的顶部对齐
android:layout_centerHorizontal 如果值为真,该控件将被至于水平方向的中央
android:layout_centerInParent 如果值为真,该控件将被至于父控件水平方向和垂直方向的中央
android:layout_centerVertical 如果值为真,该控件将被至于垂直方向的中央
未完待续。
感谢mars老师录制的教学视频:http://www.verycd.com/topics/2837883/