【01.07~08】Activity的生命周期
1、Activity的七个生命周期
OnCreate
OnStart
OnResume
OnPause
OnStop
OnRestart
OnDestroy
有个传说中的示意图~:
教程里依旧是例子来说明的,这里就不搞了,基本上理解起来还是很方便的
1、创建两个Activity,Activity01和Activity022、启动Activity01,生命周期如下:OnCreate() //这个方法也复写过很多次了~需要呈现在这个Activity的控件注册和相关监听动作绑定都是在这个方法中实现OnStart()OnResume()3、点击Activity01中的按钮,到达Activity02此时,两个Activity的生命周期如下:Activity01--->OnPause()Activity02--->OnCreate()Activity02--->OnStart()Activity02--->OnResume()Activity01--->OnStop()*由于Activity02的出现完全遮盖了Activity01,就会有OnStop这个生命周期存在;如果说Activity02是一个非完全遮盖的Activity,比如一个对话框形式的Activity,那么Activity01的OnStop()周期则不会出现*OnPause()时,我们可以在这里存储用户之前输入的信息和动作等,以便用户回到此处能继续刚才的操作4、在Activity02点击返回按钮,则会回到Activity01此时,两个Activity的生命周期如下:Activity02--->OnPause()Activity01--->OnRestart()Activity01--->OnStart()Activity01--->OnResume()Activity02--->OnStop()Activity02--->OnDestroy()也就是说,返回之后,Activity02被销毁了
生命周期还是很好理解的~
下面说的是Task,一个堆栈形式的任务管理形式,将所有的Activity放在一个栈中,以后进先出的原理,在栈顶的永远都是当前呈现的Activity
接着说了一下对话框形式的Activity要怎么写~
也就是在AndroidMainfest.xml里注册Activity时,设置属性
android:theme
=
"
@android:style/Theme.Dialog
"
把上一次的计算器拿出来,设置一下,则如下:
在这种情况下,Activity01是没有OnStop()这个生命周期的
以上~
*这节课介绍到的SDK中的Docs,如果你用的是4.1以上的,可能会出现docs页面载入非常缓慢的情况,是因为天朝墙了某哥之后,有个js文件一直请求不到,于是就卡住了o(╯□╰)o。
网上搜了一下,有个批处理的
更简单的是,如果你的浏览器有相关的屏蔽插件,比如FireFox的Adblock插件,将这个js添加到Adblock的屏蔽名单中即可(http://www.google.com/jsapi),本地打开又恢复了速度~
【01.09-01.11】Activity的布局
1、LinearLayout 线性布局,有前端基础的看这个应该很容易,分为水平布局和垂直布局= =其余不多说了。。
2、TableLayout 表格布局
嵌套如下TabelLayoutTableRowTextView(或者其他控件,也可以TableLayout有一个属性为android:stretchColumns="1",也就是说以第1列自动拉伸(列序号是从0开始的,从视觉上看应该是第二列),别的列自适应内容宽度
3、RelativeLayout 相对布局
呃,这三课有前端经验的基本不用看,非常好理解,主要在于属性较多,使用时多查查文档
【01.12】常用控件2~
1、RadioGroup和RadioButton
2、CheckBox
3、Toast(谷歌太吃货……
目标:
下面是制作步骤[´・ω・`]
1、创建一个工程,并将控件都部署上去,用的是线性布局
< LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"xmlns:tools = "http://schemas.android.com/tools"android:orientation = "vertical"android:layout_width = "match_parent"android:layout_height = "match_parent" >< TextViewandroid:id = "@+id/textView1"android:layout_width = "wrap_content"android:layout_height = "wrap_content"android:text = "@string/show_label" />< RadioGroupandroid:id = "@+id/sexgroup"android:layout_width = "fill_parent"android:layout_height = "wrap_content"android:orientation = "horizontal" >< RadioButtonandroid:id = "@+id/famale"android:layout_width = "wrap_content"android:layout_height = "wrap_content"android:text = "@string/radio_famale"/>< RadioButtonandroid:id = "@+id/male"android:layout_width = "wrap_content"android:layout_height = "wrap_content"android:text = "@string/radio_male"/></ RadioGroup >< CheckBoxandroid:id = "@+id/read"android:layout_width = "fill_parent"android:layout_height = "wrap_content"android:text = "@string/checkbox_read" />< CheckBoxandroid:id = "@+id/sleep"android:layout_width = "fill_parent"android:layout_height = "wrap_content"android:text = "@string/checkbox_sleep" />< CheckBoxandroid:id = "@+id/eat"android:layout_width = "fill_parent"android:layout_height = "wrap_content"android:text = "@string/checkbox_eat" /></ LinearLayout >
2、在Activity07中的控件创建和事件注册
package com.example.activity07;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Toast;
public class Activity07 extends Activity {
//声明
private RadioGroup radioSex = null;
private RadioButton radioFamale = null;
private RadioButton radioMale = null;
private CheckBox read = null;
private CheckBox sleep = null;
private CheckBox eat = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity07);
//获得控件对象
radioSex = (RadioGroup)findViewById(R.id.sexgroup);
radioFamale = (RadioButton)findViewById(R.id.famale);
radioMale = (RadioButton)findViewById(R.id.male);
read = (CheckBox)findViewById(R.id.read);
sleep = (CheckBox)findViewById(R.id.sleep);
eat = (CheckBox)findViewById(R.id.eat);
//RadioGroup对象的监听器
radioSex.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
//一个匿名内部类
public void onCheckedChanged(RadioGroup group, int checkedId) {
// TODO Auto-generated method stub
if(radioFamale.getId() == checkedId){
Toast.makeText(Activity07.this, "famale", Toast.LENGTH_SHORT).show();
}
else if(radioMale.getId() == checkedId){
Toast.makeText(Activity07.this, "male", Toast.LENGTH_SHORT).show();
}
}
});
//Checkbox对象的监听器
read.setOnCheckedChangeListener(new checkboxclick());
sleep.setOnCheckedChangeListener(new checkboxclick());
eat.setOnCheckedChangeListener(new checkboxclick());
}
class checkboxclick implements OnCheckedChangeListener{
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
// TODO Auto-generated method stub
if(isChecked){
Toast.makeText(Activity07.this, "checked", Toast.LENGTH_SHORT).show();
}
else{
Toast.makeText(Activity07.this, "false", Toast.LENGTH_SHORT).show();
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity07, menu);
return true;
}
}
结果
写的时候借助于提示信息,还是比较容易的,主要是相关监听器可能不是很清楚,所以还是多查查Api哦
【01.13】常见控件3
1、ProgressBar
2、ListView
ProgressBar实例
1、创建一个应用,并布局
< LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"xmlns:tools = "http://schemas.android.com/tools"android:layout_width = "match_parent"android:layout_height = "match_parent"android:orientation = "vertical" >
< ProgressBarandroid:id = "@+id/progressOne"style = "?android:attr/progressBarStyle"android:layout_width = "wrap_content"android:layout_height = "wrap_content"android:visibility = "gone" />< ProgressBarandroid:id = "@+id/progressTwo"style = "?android:attr/progressBarStyleHorizontal"android:layout_width = "wrap_content"android:layout_height = "wrap_content"android:visibility = "gone"android:max = "10" />< Buttonandroid:id = "@+id/mybutton"android:layout_width = "wrap_content"android:layout_height = "wrap_content"android:text = "@string/button" /></ LinearLayout >
需要注意到几个属性
style,进度条的样式不止这两种- -可以从可视布局看到,起码有四种android:max是进度条的最大值,也可以在函数中设置
2、对象创建和事件绑定
package com.example.activity08;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.*;
public class ProgressActivity extends Activity {
private ProgressBar pone = null;
private ProgressBar ptwo = null;
private Button mybt = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout. activity_progress );
//创建控件对象
pone = (ProgressBar)findViewById(R.id. progressOne);
ptwo = (ProgressBar)findViewById(R.id. progressTwo);
mybt = (Button)findViewById(R.id. mybutton);
//绑定对应监听器
mybt .setOnClickListener( new buttonClick());
}
private int i = 0;
class buttonClick implements OnClickListener{
public void onClick(View v) {
// TODO Auto-generated method stub
if (i ==0){
//显示进度条
pone .setVisibility(View. VISIBLE);
ptwo .setVisibility(View. VISIBLE);
}
else if ( i<10){
//转圈圈进度 默认如下,不需要写
//pone.setProgress(i);
//横向进度条,包括第一进度,和第二进度,可以区分不同任务的进度
ptwo .setProgress(i );
ptwo .setSecondaryProgress(i +1);
}
else {
pone .setVisibility(View. INVISIBLE);
ptwo .setVisibility(View. INVISIBLE);
}
i ++;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu. activity_progress , menu);
return true ;
}
}
下面是至今为止遇到的最复杂的一个控件~ListView
1、照旧,创建一个应用,这个控件是需要分成两个部分来处理,一个是主界面,一个是ListView里的单个对象
activity_listview.xml
< LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"xmlns:tools = "http://schemas.android.com/tools"android:layout_width = "fill_parent"android:layout_height = "fill_parent"android:orientation = "vertical" >< ListViewandroid:id = "@id/android:list"android:layout_width = "fill_parent"android:layout_height = "wrap_content"android:drawSelectorOnTop = "false"android:scrollbars = "vertical" ></ ListView ></ LinearLayout >
这里一个新的属性android:drawSelectorOnTop ="false"这是一个长按下会用到的属性如果设置成true则如下
设置成false的话,背景色会在文字下面,文字可见
item.xml
< LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"xmlns:tools = "http://schemas.android.com/tools"android:layout_width = "fill_parent"android:layout_height = "fill_parent"android:paddingLeft = "10dip"android:paddingRight = "10dip"android:paddingTop = "1dip"android:paddingBottom = "1dip"android:orientation = "horizontal" >< TextViewandroid:id = "@+id/item_name"android:layout_width = "80dip"android:layout_height = "30dip"android:textSize = "20sp"android:singleLine = "true" />< TextViewandroid:id = "@+id/item_price"android:layout_height = "fill_parent"android:layout_width = "fill_parent"android:gravity = "right"android:textSize = "20sp" /></ LinearLayout >
2、在ListviewActivity.java中
package com.example.hellolistview;
import java.util.ArrayList;
import java.util.HashMap;
import android.os.Bundle;
import android.app.ListActivity;
import android.view.View;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
public class ListviewActivity extends ListActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout. activity_listview );
//创建一个list,用另外一种视角看,相当于JSON数据的样子ORZ
ArrayList<HashMap<String,String>> list=
new ArrayList<HashMap<String,String>>();
//创建list中的每个数据对对象
HashMap<String, String> item1 = new HashMap<String, String>();
HashMap<String, String> item2 = new HashMap<String, String>();
HashMap<String, String> item3 = new HashMap<String, String>();
//给数据对赋值
item1.put( "item_name" , "面包" );
item1.put( "item_price" ,"$10" );
item2.put( "item_name" , "蛋糕" );
item2.put( "item_price" ,"$15" );
item3.put( "item_name" , "布丁" );
item3.put( "item_price" ,"$20" );
//将数据添加到list中
list.add(item1);
list.add(item2);
list.add(item3);
//创建一个数据适配器,参数分别是对象,数据来源,数据显示 xml对象,键值对象,显示键值的控件对象
SimpleAdapter adapter = new SimpleAdapter(
this , list,
R.layout. item ,
new String[] {"item_name" , "item_price"},
new int [] {R.id. item_name,R.id. item_price });
//将数据加到listview 控件中
setListAdapter(adapter);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
// TODO Auto-generated method stub
super.onListItemClick(l, v, position, id);
Toast. makeText(ListviewActivity. this, id+ "," +position, Toast.LENGTH_SHORT ).show();
}
}
需要注意的是,这次继承于ListActivity类,而不是一贯的Activity= =
实际上setContentView写不写无所谓,因为最后是由适配器来创建这个对象的
理解list还是有点绕,多想想JSON和图,应该能快点消化,
首先需要创建一个ArrayList对象,再创建对象中的每个数据对象,对应数据键值赋值后放入ArrayList对象中;再由适配器将数据和显示资源联系起来,并加载到主界面中
运行如下