3475
- 收藏
- 点赞
- 分享
- 举报
Android学习笔记(2)-初识Activity
Android学习笔记(2)-初识Activity
根据文档的解释,Activity是Android开发中非常重要的一个基础类。我把它想像成J2ME中的Display类,或者是Win32平台上的Form类,也许不准确,但是它的重要性我觉得应该是一样的(当然,如果我们写的是一个没有界面的应用,例如后台运行的服务之类的,可以不用Display的)。
1.在一个Activity中使用多个View
如果把Activity看作MVC中的Control?它负责管理UI和接受事件(包括用户的输入),虽然说一个Activity通常对应一个屏幕,但事实上,我们是可以只用一个Activity管理多个不同的View来实现简单的逻辑。
首先,我们增加一个新的资源描述layout/second.xml。
androidrientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Hello 中国"
/>
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:text="back">
除了一个“Hello中国”以外,增加一个按钮可以返回前一个界面。然后,在代码中我们要为helloTwo增加两个方法,setViewOneCommand和setViewTwoCommand,分别处理一下在不同界面时,从资源里加载组件并为组件绑定一个事件处理器。
public void setViewOneCommand()
{
Button btn = (Button)findViewById(R.id.go);
btn.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
helloTwo.this.setContentView(R.layout.second);
helloTwo.this.setViewTwoCommand();
}
});
Button btnExit=(Button)findViewById(R.id.exit);
btnExit.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
helloTwo.this.finish();
}
});
}
public void setViewTwoCommand()
{
Button btnBack=(Button)findViewById(R.id.go2);
btnBack.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
helloTwo.this.setContentView(R.layout.main);
helloTwo.this.setViewOneCommand();
}
});
}
最后,我们需要在onCreate的时候,也就是启动后的main界面上设置一下按钮事件处理器。新的onCreate方法如下:
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setTheme(android.R.style.Theme_Dark);
setContentView(R.layout.main);
setViewOneCommand();
}
编译,运行,OK。
2.还是回到正道上,多个Activity之间的跳转
Android中提供一个叫Intent的类来实现屏幕之间的跳转,按文档的说法,似乎他们也建议采用这种方法,Intent的用法比较复杂,现在我先看看它最简单的用法。
先在应用中增加两个Activity,这需要修改AndroidManifest.xml文件了,如下:
package="cn.sharetop.android.hello.three">
很简单,就是加一个标签而已,新标签的class是.HelloThreeB,显示的应用标题与前一个Activity一样而已,然后第二步就是修改一个HelloThree类的实现,在onCreate方法中绑定按钮的事件处理器:
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setTheme(android.R.style.Theme_Dark);
setContentView(R.layout.main);
setViewOneCommand();
}
public void setViewOneCommand()
{
Button btn = (Button)findViewById(R.id.go);
btn.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
Intent intent = new Intent();
intent.setClass(HelloThree.this, HelloThreeB.class);
startActivity(intent);
finish();
}
});
Button btnExit=(Button)findViewById(R.id.exit);
btnExit.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
HelloThree.this.finish();
}
});
}
这里的跳转功能用Intent来操作,它的最简单用法就是用函数setClass()设置跳转前后两个Activity类的实例,然后调用Activity自己的startActivity(intent)即可。最后一句finish()表示将当前Activity关掉(如果不关掉会如何?你可以自己试一下看效果,事实上有时我们是不需要关掉当前Activity的)。
然后,我们同样弄一个Activity类HelloThreeB,代码与前面的差不多,只是将setClass的两个参数反一下,这样就可以简单地实现在两个Activity界面中来回切换的功能了。
3.如果我想在两个Activity之间进行数据交换,怎么办?
前例中的startActivity()只有一个参数,如果需要向新打开的Activity传递参数,我们得换一个函数了, Android提供了startSubActivity(Intent,int)这个函数来实现这个功能。
函数原型为: public void startSubActivity(Intent intent, int requestCode)
这里的requestCode用来标识某一个调用,一般由我们定义一个常量。
如何把参数传过去呢?Intent类在提供setClass()函数的同时也提供了一个setData()函数。
函数原型为:public Intent setData(ContentURI data)
参数类型是ContentURI,它的详细内容下回再分析,现在就把它当成一个String类型来用吧。
参数带到新的Activity后,同样用Activity.getIntent()函数可以得到当前过来的Intent对象,然后用getData()就取到参数了。
把参数带回来的方法是Activity.setResult(),它有几个形式,现在先看最简单的一个吧。
函数原型是:public final void setResult(int resultCode, String data)
resultCode是返回代码,同样用来标识一个返回类型,而data则是它要返回的参数。
在原来的Activity中的事件处理回调函数onActivityResult,会被系统调用,从它的参数里可以得到返回值。
函数原型为:protected void onActivityResult(int requestCode, int resultCode,String data, Bundle extras)
这里的requestCode就是前面启动新Activity时的带过去的requestCode,而resultCode则关联上了setResult中的resultCode,data是参数,extras也是一个很重要的东西,后面再研究一下它的作用。
下面,我们来看一下代码吧,先看看HelloThree中的代码:
public void setViewOneCommand()
{
Button btn = (Button)findViewById(R.id.go);
btn.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
try
{
Intent intent = new Intent();
intent.setClass(HelloThree.this, HelloThreeB.class);
intent.setData(new ContentURI("One"));
startSubActivity(intent,REQUEST_TYPE_A);
}
catch(Exception ex){}
}
});
Button btnExit=(Button)findViewById(R.id.exit);
btnExit.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
HelloThree.this.finish();
}
});
}
protected void onActivityResult(int requestCode, int resultCode,
String data, Bundle extras)
{
if (requestCode == REQUEST_TYPE_A) {
if (resultCode == RESULT_OK) {
Log.v(TAG,data);
TextView txt = (TextView)findViewById(R.id.txt);
txt.setText(data);
}
}
}
这里的REQUEST_TYPE_A是我们定义的一个常量。在onActivityResult中用它与RESULT_OK一起作为条件判断如何处理返回值,这里只是简单将TextView显示值换成传来的字串。
再来看看另一个HelloThreeB类的实现代码:
private Intent i;
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.second);
i = getIntent();
android.util.Log.v(TAG,"onCreate");
Button btn = (Button)findViewById(R.id.go);
btn.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
String result=HelloThreeB.this.i.getData().toString()+" And Two";
HelloThreeB.this.setResult(RESULT_OK,result);
finish();
}
});
TextView v = (TextView)findViewById(R.id.txt);
v.setText("Param is "+i.getData().toString());
}
在按钮处理事件中,从Intent取出参数,处理一下再用setResult返回给前一个Activity即可。
编译运行即可。
今天先到这里,下一回我再研究一下Activity的生命周期的问题
根据文档的解释,Activity是Android开发中非常重要的一个基础类。我把它想像成J2ME中的Display类,或者是Win32平台上的Form类,也许不准确,但是它的重要性我觉得应该是一样的(当然,如果我们写的是一个没有界面的应用,例如后台运行的服务之类的,可以不用Display的)。
1.在一个Activity中使用多个View
如果把Activity看作MVC中的Control?它负责管理UI和接受事件(包括用户的输入),虽然说一个Activity通常对应一个屏幕,但事实上,我们是可以只用一个Activity管理多个不同的View来实现简单的逻辑。
首先,我们增加一个新的资源描述layout/second.xml。
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
android:layout_height="wrap_content"
android:text="Hello 中国"
/>
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:text="back">
除了一个“Hello中国”以外,增加一个按钮可以返回前一个界面。然后,在代码中我们要为helloTwo增加两个方法,setViewOneCommand和setViewTwoCommand,分别处理一下在不同界面时,从资源里加载组件并为组件绑定一个事件处理器。
public void setViewOneCommand()
{
Button btn = (Button)findViewById(R.id.go);
btn.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
helloTwo.this.setContentView(R.layout.second);
helloTwo.this.setViewTwoCommand();
}
});
Button btnExit=(Button)findViewById(R.id.exit);
btnExit.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
helloTwo.this.finish();
}
});
}
public void setViewTwoCommand()
{
Button btnBack=(Button)findViewById(R.id.go2);
btnBack.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
helloTwo.this.setContentView(R.layout.main);
helloTwo.this.setViewOneCommand();
}
});
}
最后,我们需要在onCreate的时候,也就是启动后的main界面上设置一下按钮事件处理器。新的onCreate方法如下:
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setTheme(android.R.style.Theme_Dark);
setContentView(R.layout.main);
setViewOneCommand();
}
编译,运行,OK。
2.还是回到正道上,多个Activity之间的跳转
Android中提供一个叫Intent的类来实现屏幕之间的跳转,按文档的说法,似乎他们也建议采用这种方法,Intent的用法比较复杂,现在我先看看它最简单的用法。
先在应用中增加两个Activity,这需要修改AndroidManifest.xml文件了,如下:
很简单,就是加一个
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setTheme(android.R.style.Theme_Dark);
setContentView(R.layout.main);
setViewOneCommand();
}
public void setViewOneCommand()
{
Button btn = (Button)findViewById(R.id.go);
btn.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
Intent intent = new Intent();
intent.setClass(HelloThree.this, HelloThreeB.class);
startActivity(intent);
finish();
}
});
Button btnExit=(Button)findViewById(R.id.exit);
btnExit.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
HelloThree.this.finish();
}
});
}
这里的跳转功能用Intent来操作,它的最简单用法就是用函数setClass()设置跳转前后两个Activity类的实例,然后调用Activity自己的startActivity(intent)即可。最后一句finish()表示将当前Activity关掉(如果不关掉会如何?你可以自己试一下看效果,事实上有时我们是不需要关掉当前Activity的)。
然后,我们同样弄一个Activity类HelloThreeB,代码与前面的差不多,只是将setClass的两个参数反一下,这样就可以简单地实现在两个Activity界面中来回切换的功能了。
3.如果我想在两个Activity之间进行数据交换,怎么办?
前例中的startActivity()只有一个参数,如果需要向新打开的Activity传递参数,我们得换一个函数了, Android提供了startSubActivity(Intent,int)这个函数来实现这个功能。
函数原型为: public void startSubActivity(Intent intent, int requestCode)
这里的requestCode用来标识某一个调用,一般由我们定义一个常量。
如何把参数传过去呢?Intent类在提供setClass()函数的同时也提供了一个setData()函数。
函数原型为:public Intent setData(ContentURI data)
参数类型是ContentURI,它的详细内容下回再分析,现在就把它当成一个String类型来用吧。
参数带到新的Activity后,同样用Activity.getIntent()函数可以得到当前过来的Intent对象,然后用getData()就取到参数了。
把参数带回来的方法是Activity.setResult(),它有几个形式,现在先看最简单的一个吧。
函数原型是:public final void setResult(int resultCode, String data)
resultCode是返回代码,同样用来标识一个返回类型,而data则是它要返回的参数。
在原来的Activity中的事件处理回调函数onActivityResult,会被系统调用,从它的参数里可以得到返回值。
函数原型为:protected void onActivityResult(int requestCode, int resultCode,String data, Bundle extras)
这里的requestCode就是前面启动新Activity时的带过去的requestCode,而resultCode则关联上了setResult中的resultCode,data是参数,extras也是一个很重要的东西,后面再研究一下它的作用。
下面,我们来看一下代码吧,先看看HelloThree中的代码:
public void setViewOneCommand()
{
Button btn = (Button)findViewById(R.id.go);
btn.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
try
{
Intent intent = new Intent();
intent.setClass(HelloThree.this, HelloThreeB.class);
intent.setData(new ContentURI("One"));
startSubActivity(intent,REQUEST_TYPE_A);
}
catch(Exception ex){}
}
});
Button btnExit=(Button)findViewById(R.id.exit);
btnExit.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
HelloThree.this.finish();
}
});
}
protected void onActivityResult(int requestCode, int resultCode,
String data, Bundle extras)
{
if (requestCode == REQUEST_TYPE_A) {
if (resultCode == RESULT_OK) {
Log.v(TAG,data);
TextView txt = (TextView)findViewById(R.id.txt);
txt.setText(data);
}
}
}
这里的REQUEST_TYPE_A是我们定义的一个常量。在onActivityResult中用它与RESULT_OK一起作为条件判断如何处理返回值,这里只是简单将TextView显示值换成传来的字串。
再来看看另一个HelloThreeB类的实现代码:
private Intent i;
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.second);
i = getIntent();
android.util.Log.v(TAG,"onCreate");
Button btn = (Button)findViewById(R.id.go);
btn.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
String result=HelloThreeB.this.i.getData().toString()+" And Two";
HelloThreeB.this.setResult(RESULT_OK,result);
finish();
}
});
TextView v = (TextView)findViewById(R.id.txt);
v.setText("Param is "+i.getData().toString());
}
在按钮处理事件中,从Intent取出参数,处理一下再用setResult返回给前一个Activity即可。
编译运行即可。
今天先到这里,下一回我再研究一下Activity的生命周期的问题
我来回答
回答0个
时间排序
认可量排序
暂无数据
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片![alt](url)
相关问答
-
2012-11-27 20:07:15
-
2012-11-27 20:39:59
-
2012-11-27 20:00:45
-
2012-11-27 20:41:12
-
2012-12-02 22:49:04
-
2013-08-29 15:08:54
-
02018-12-19 16:17:42
-
2018-12-07 17:44:57
-
02008-11-12 19:40:51
-
2015-08-09 10:10:29
-
2013-08-28 13:57:20
-
222019-08-20 16:57:22
-
2015-07-10 11:01:46
-
2015-07-15 11:52:17
-
2015-08-17 14:25:56
-
2013-08-25 11:17:43
-
2013-08-25 12:02:13
-
2013-08-25 11:11:11
-
12022-05-18 18:55:50
无更多相似问答 去提问
点击登录
-- 积分
-- E币
提问
—
收益
—
被采纳
—
我要提问
切换马甲
上一页
下一页
悬赏问答
-
5Hi3516CV610 如何使用SD卡升级固件
-
5cat /dev/logmpp 报错 <3>[ vi] [func]:vi_send_frame_node [line]:99 [info]:vi pic queue is full!
-
50如何获取vpss chn的图像修改后发送至vo
-
5FPGA通过Bt1120传YUV422数据过来,vi接收不到数据——3516dv500
-
50SS928 运行PQtools 拼接 推到设备里有一半画面会异常
-
53536AV100的sample_vdec输出到CVBS显示
-
10海思板子mpp怎么在vi阶段改变视频数据尺寸
-
10HI3559AV100 多摄像头同步模式
-
9海思ss928单路摄像头vio中加入opencv处理并显示
-
10EB-RV1126-BC-191板子运行自己编码的程序
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
提醒
你的问题还没有最佳答案,是否结题,结题后将扣除20%的悬赏金
取消
确认
提醒
你的问题还没有最佳答案,是否结题,结题后将根据回答情况扣除相应悬赏金(1回答=1E币)
取消
确认