多个Activity之间的相互调用:
新建一个继承Activity的类,在功能清单文件中添加进上面Activity配置代码,
打开新的Activity:startActivity(newIntent(,));
打开新的Activity,并传递若干个参数给它:
Intentintent=newIntent(,)
Bundlebundle=newBundle();//该类用作携带数据
ing("name","传智播客");
("age",4);
ras(bundle);//附带上额外的数据
startActivity(intent);
在另一个Activity里面接收参数:
Bundlebundle=ent_r().getExtras_r();
Stringname=ing_r("name");
intage=_r("age");
Bundle类用作携带数据,它类似于Map,用于存放key-value名值对形式的值。相对于Map,它提供了各
种常用类型的putXxx()/getXxx_r()方法,如:putString()/getString_r()和putInt()/getInt_r(),putXxx()用于往
Bundle对象放入数据,getXxx_r()方法用于从Bundle对象里获取数据。Bundle的内部实际上是使用了
HashMap类型的变量来存放putXxx()方法放入的值:
请求码的作用:
使用startActivityForResult(Intentintent,intrequestCode)方法打开新的Activity,我们需要为
startActivityForResult()方法传入一个请求码(第二个参数)。请求码的值是根据业务需要由自已设定,用于标识
请求来源。例如:一个Activity有两个按钮,点击这两个按钮都会打开同一个Activity,不管是那个按钮打开
新Activity,当这个新Activity关闭后,系统都会调用前面Activity的onActivityResult(intrequestCode,int
resultCode,Intentdata)方法。在onActivityResult()方法如果需要知道新Activity是由那个按钮打开的,并且要做
出相应的业务处理。
结果码的作用:
在一个Activity中,可能会使用startActivityForResult()方法打开多个不同的Activity处理不同的业务,当
这些新Activity关闭后,系统都会调用前面Activity的onActivityResult(int
Activity跳转与传值,主要是通过Intent类来连接多个Activity,以及传递数据。
Intent是Android一个很重要的类。Intent直译是“意图”,什么是意图呢?比如你想从这个
Activity跳转到另外一个Activity,这就是一个意图。Intent类在Android系统中的作用很大,
在此不详细说了,后面有文章介绍!
Activity跳转,无返回结果
这是最简单的Activity跳转方式。从一个Activity启动另一个Activity,直接
startActivity(newIntent(当前,下一))。
((Button)findViewById(dv1)).tOnClickListener(new
OnClickListener(){
publicvoidonClick(Viewv){
startActivity(newIntent(,
));
}
});
Activity跳转,返回数据/结果
需要返回数据或结果的,则使用startActivityForResult(Intentintent,intrequestCode)
,requestCode的值是自定义的,用于识别跳转的目标Activity。
跳转的目标Activity所要做的就是返回数据/结果,tResult(intresultCode)只返回结果不带
数据,或者tResult(intresultCode,Intentdata)两者都返回!
而接收返回的数据/结果的处理函数是onActivityResult(intrequestCode,intresultCode,Intent
data),这里的requestCode就是startActivityForResult的requestCode,resultCode就是tResult
里面的resultCode,返回的数据在data里面。
MyAndroidAppActivity:
staticfinalintSEND_SMS_REQUEST=0;
staticfinalintCALL_REQUEST=1;
((Button)findViewById()).tOnClickListener(new
OnClickListener(){
publicvoidonClick(Viewv){
Intentintent=newIntent(,
);
startActivityForResult(intent,SEND_SMS_REQUEST);
}
});
@Override
protectedvoidonActivityResult(intrequestCode,intresultCode,Intent
data){
if(requestCode==SEND_SMS_REQUEST){
if(resultCode==RESULT_OK){
xt(this,"SendSMSRESULT_OK",
_SHORT).show();
}elif(resultCode==RESULT_CANCELED){
Bundlebundle=ras();
Stringphoneno=ing("phoneNO");
xt(this,"SendSMSRESULT_CANCELED"+phoneno,
_SHORT).show();
}
}elif(requestCode==CALL_REQUEST){
if(resultCode==RESULT_CANCELED){
xt(this,"CallRESULT_CANCELED",
_SHORT).show();
}
}
}
SendSMSActivity:
((Button)findViewById()).tOnClickListener(new
kListener(){
publicvoidonClick(Viewv){
ult(RESULT_OK);
();
}
}):
**注意,在tResult后,要调用finish()销毁当前的Activity,否则无法返回到原来的
Activity,就无法执行原来Activity的onActivityResult函数,看到当前的Activity没反应。
RESULT_OK和RESULT_CANCELED是系统空间里面的常量,不需要自定义,直接使用
就行。
另外在运行过程中,发现按Back键后,是可以返回RESULT_CANCELED的,看了SDK
doc后,原来真的是那样,而且不带有数据的。这意味着,如果你设想在返回
RESULT_CANCELED时并返回数据,那么需要截获Back键的事件处理,把原来返回
RESULT_CANCELED的核心逻辑copy到事件处理里面。这里给个例子:
((Button)findViewById()).tOnClickListener(new
kListener(){
publicvoidonClick(Viewv){
//实例化Bundle,设置需要传递的参数
Bundlebundle=newBundle();
ing("phoneNO","020-123");
ult(RESULT_CANCELED,
ent().putExtras(bundle));
();
}
});
@Override
publicbooleanonKeyDown(intkeyCode,KeyEventevent){
//是否触发按键为back键
if(keyCode==E_BACK){
//实例化Bundle,设置需要传递的参数
Bundlebundle=newBundle();
ing("phoneNO","020-123");
tResult(RESULT_CANCELED,ent().putExtras(bundle));
();
returntrue;
}el{
own(keyCode,event);
}
}
这里要注意的是,在处理Back键事件后returntrue则表示本事件不再传递给其他函数处
理,可理解为由当前函数全权负责处理,所以在return前finish当前Activity,保持原来的行
为表现,当然我们可以设置为隐藏当前Activity等其他行为。
Activity传送数据
在上面的代码中,我们可以看到使用Bundle来存储数据,并将其putExtras到Intent里
面。Bundle使用“名字-值”来存储数据。另外注意一下,tResult需要用到Intent参数时,如何
获取原来的Intent的!
Android開發筆記-Activity間互相傳值
內容說明:在頁面之間互相傳值
資料來源:Android南部工作坊
在Android的應用程式裡,會有一個Bundle的物件,它就像是用來儲存全域變數的一個地
方,我們的程式在onCreate的時候就會看到裡面含有傳入的參數BundlesavedInstanceState。
首先參考「轉換頁面」一文,建立新的頁面,並且將最後一段呼叫頁面的程式碼改成下面的程
式,增加Bundle參數傳遞資料,並且要求回傳值。
25
26
27
28
29
30
31
32
Intentintent=newIntent();
ss(,);
//設定傳送參數
Bundlebundle=newBundle();
ing("name1","value1");
ras(bundle);//將參數放入intent
startActivityForResult(intent,0);//呼叫page2並要求回傳值
來到page2,在onCreate方法中,可以使用下面程式碼來取得參數:
11
12
13
Intentintent=ent();
Bundlebundle=ras();//取得Bundle
txt_t(ing("name1"));//輸出Bundle內容
如果要在page2加入回傳值,一樣使用putString加入。此時在Bundle中存在name1和name2。
1
2
3
4
ing("name2","value2");
ras(bundle);//將name2放入Bundle
ult(_OK,intent);//回傳RESULT_OK
();//關閉Activity
回到main主頁面,參考讀取QRCode,增加onActivityResult方法,在裡面加入下面程式碼
來取得回傳值:
37
38
39
40
41
42
43
44
45
46
@Override
protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){
//TODOAuto-generatedmethodstub
vityResult(requestCode,resultCode,data);
if(requestCode==0&&resultCode==_OK){
Bundlebundle=ras();
txt_t(ing("name2"));
}
}
***************************************************
Activity跳转与传值
一个Android应用程序很少会只有一个Activity对象,如何在多个Activity之间进行跳
转,而且能够互相传值是一个很基本的要求。
在前面创建的MyApp中,我们通过点击按钮可以更新当前界面上的文本内容。现在我们
想换种方式,在点击按钮后,显示一个新的屏幕,在这个屏幕上输入一段话,然后再返回到原
先的界面显示刚才输入的那句话。
首先我们新建这个新屏幕的布局文件,并添加一个文本输入框和一个按钮(注
意,xml元素的命名不要和其他布局文件中的定义重名,因为所有的资源都在R中进行索引,
比如id,如果重名了在使用.*的时候就会有问题了)。这个布局文件对应的是一个
Activity,因此我们再新建一个Input类(继承自Activity)用于显示这个布局并响应事件。
然后,还有一个重要的工作,那就是在清单文件中告诉程序,我定
义了一个新的Activity,你可以去调用它。
我们希望在以前的那个主界面上点击按钮以后可以跳转到文本输入界面,所以我们需要对
按钮的onClick事件进行定义:
在这段代码里出现了一些新东西。首先是Intent,它是Android一个很重要的类.Intent直
译是“意图”,什么是意图呢?比如你想从这个Activity跳转到另外一个Activity,这就是一个
意图。它不但可以连接多个Activity,还可以在它们之间传递数据。在这里,我们就是用Intent
从MyApp对象跳转到了Input对象。
再看紧跟着的startActivityForResult()方法,顾名思义,它可以从一个定义好的Intent对象启动
一个新的Activity,并且,这个Activity会返回执行的结果,这些内容下面马上就会提到。
Activity跳转与传值
好,这里我们已经可以调出新Activity了,我们看一下执行的结果:
你马上可以想到,现在需要对新的Activity(Input)进行处理了。我们在点击“确定”按钮
的时候,需要获得上面EditText对象中的文本,然后返回到前一个Activity(MyApp)中去。
看我们的按钮事件处理:
这里的关键是SharedPreferences对象,这是在多个Activity(同一包中)共享数据的方
式,本质上它就是一个可以在包的范围内进行数据共享的文件。
我们通过一个标签“Text”获得了和文本相关的那个SharedPreferences对象(“Text”仅仅是
自己定义的一个标签),然后给它赋予一个“text”对象值为当前文本框中输入的文本。设置完
成以后,设置当前Activity的执行结果为RESULT_OK,再关闭当前的Activity,剩下的事情
就可以回到MyApp这个主界面中去执行了。
其实剩下的事情也很简单,在MyApp这个Activity中,我们需要重写一个函数,
onActivityResult()。因为我们启动Input这个Activity的时候使用的是startActivityForResult()方
法,这个方法会使Input执行完以后返回给MyApp一个结果,MyApp接收到返回结果的时候
会触发onActivityResult事件,对于结果的处理就在onActivityResult()中进行。同样,我们通过
“Text”这个标签获得SharedPreferences对象,再把字符串从“text”对象中取出来并显示到当前屏
幕上。
另外说明一下,requestCode是用来标识请求对象,我们刚才在启动Activity的时候使用的
是“startActivityForResult(intent,0)”,这里的0就是requestCode,当然,你可以设置成任何你喜
欢的值。
我们看一下执行结果:
本文发布于:2022-12-26 14:56:36,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/34322.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |