⿊马程序员_android笔记6
---------------------- 、、期待与您交流! ----------------------
第五天
1、 为应⽤添加新的Activity:
第⼀步:新建⼀个继承Activity的类,如:NewActivity
public class NewActivity extends Activity {
@Override protected void onCreate(Bundle savedInstanceState) {
//这⾥可以使⽤setContentView()显⽰某个视图....
}
}
第⼆步:需要在功能清单l⽂件中添加进上⾯Activity配置代码(红⾊部分):……
<application android:icon="@drawable/icon" android:label="@string/app_name">
.....
<activity android:name=".NewActivity" android:label="新activity的页⾯标题"/>
</application>……
android:name属性值的前⾯加了⼀个点表⽰NewActivity是当前包cn.itcast.action下的类,如果类在应⽤的当前包下,可以省略点符号,如果类在应⽤的⼦包下必须加点,如:NewActivity类在cn.itcast.action.user包下可以这样写:
<activity android:name=“.user.NewActivity“ />
打开新的Activity:
第⼀种:打开新的Activity,不传递参数
public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
.......
Button button =(Button) this.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
//三种打开Activity的⽅法:
/* 1、 intent.setClass(MainActivity.this, OtherActivity.class);//设置要激活的组件
2、intent.setComponent(new ComponentName(MainActivity.this, OtherActivity.class));//设置要激活的组件
startActivity(intent);*/
//显式意图,第⼀个参数为当前Activity类对象,第⼆个参数为你要打开的Activity类
3、 startActivity(new Intent(MainActivity.this, NewActivity.class));
}}); }}
第⼆种:打开新的Activity,并传递若⼲个参数给它:
public class MainActivity extends Activity {
@Override protected void onCreate(Bundle savedInstanceState) {
.......
button.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, NewActivity.class)
Bundle bundle = new Bundle();//该类⽤作携带数据
bundle.putString("name", "传智播客");
bundle.putInt("age", 4);
intent.putExtras(bundle);//附带上额外的数据
startActivity(intent); }}); }
}
在新的Activity中接收前⾯Activity传递过来的参数:
public class NewActivity extends Activity {
@Override protected void onCreate(Bundle savedInstanceState) {
........
Bundle bundle = Intent().getExtras();
String name = String("name");
int age = Int("age"); }}
为Intent附加数据的两种写法:
第⼀种写法,⽤于批量添加数据到Intent:
Intent intent = new Intent();
Bundle bundle = new Bundle();//该类⽤作携带数据
bundle.putString("name", "传智播客");
intent.putExtras(bundle);//为意图追加额外的数据,意图原来已经具有的数据不会丢失,但key同名的数据会被替换
第⼆种写法:这种写法的作⽤等价于上⾯的写法,只不过这种写法是把数据⼀个个地添加进Intent,这种写法使⽤起来⽐较⽅便,⽽且只需要编写少量的代码。
Intent intent = new Intent();
intent.putExtra("name", "传智播客");
Intent提供了各种常⽤类型重载后的putExtra()⽅法,如: putExtra(String name, String value)、
putExtra(String name, long value),在putExtra()⽅法内部会判断当前Intent对象内部是否已经存在⼀
个Bundle对象,如果不存在就会新建Bundle对象,以后调⽤putExtra()⽅法传⼊的值都会存放于该Bundle对象。
2、 得到新打开Activity 关闭后返回的数据
如果你想在Activity中得到新打开Activity 关闭后返回的数据,你需要使⽤系统提供
的startActivityForResult(Intent intent, int requestCode)⽅法打开新的Activity,新的Activity 关闭后会向前⾯的Activity 传回数据,为了得到传回的数据,你必须在前⾯的Activity中重写onActivityResult(int requestCode, int resultCode, Intent data)⽅法:
public class MainActivity extends Activity {
@Override protected void onCreate(Bundle savedInstanceState) {
.......
Button button =(Button) this.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
//第⼆个参数为请求码,可以根据业务需求⾃⼰编号
startActivityForResult (new Intent(MainActivity.this, NewActivity.class), 1); }}); }
//第⼀个参数为请求码,即调⽤startActivityForResult()传递过去的值
//第⼆个参数为结果码,结果码⽤于标识返回数据来⾃哪个新Activity
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {//得到新Activity 关闭后返回的数据
String result = Extras().getString(“result”)); }}
当新Activity关闭后,新Activity返回的数据通过Intent进⾏传递,android平台会调⽤前⾯Activity 的onActivityResult()⽅法,把存放了返回数据的Intent作为第三个输⼊参数传⼊,在onActivityResult()⽅法中使⽤第三个输⼊参数可以取出新Activity返回的数据。
使⽤startActivityForResult(Intent intent, int requestCode)⽅法打开新的Activity,新Activity关闭前向前⾯的Activity返回数据需要使⽤系统提供的setResult(int resultCode, Intent data)⽅法实现:
public class NewActivity extends Activity {
@Override protected void onCreate(Bundle savedInstanceState) {
......
button.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
Intent intent = new Intent();//数据是使⽤Intent返回
intent.putExtra(“result”, “传智播客的学⽣很可爱”);//把返回数据存⼊Intent
NewActivity.this.setResult(RESULT_OK, intent);//设置返回数据
NewActivity.this.finish(); }}); }}
请求码的作⽤:
使⽤startActivityForResult(Intent intent, int requestCode)⽅法打开新的Activity,我们需要为startActivi
tyForResult()⽅法传⼊⼀个请求码(第⼆个参数)。请求码的值是根据业务需要由⾃已设定,⽤于标识请求来源。例如:⼀个Activity有两个按钮,点击这两个按钮都会打开同⼀个Activity,不管是哪个按钮打开新Activity,当这个新Activity关闭后,系统都会调⽤前⾯Activity的
onActivityResult(int requestCode, int resultCode, Intent data)⽅法。在onActivityResult()⽅法如果需要知道新Activity是由哪个按钮打开的,并且要做出相应的业务处理,这时可以这样做:
@Override public void onCreate(Bundle savedInstanceState) {
....
button1.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
startActivityForResult(new Intent(MainActivity.this, NewActivity.class), 1); }});
button2.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
startActivityForResult (new Intent(MainActivity.this, NewActivity.class), 2); }});
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch(requestCode){
case 1:
//来⾃按钮1的请求,作相应业务处理
case 2:
//来⾃按钮2的请求,作相应业务处理
} }}
结果码的作⽤:
在⼀个Activity中,可能会多个按钮或⼀个按钮使⽤startActivityForResult()⽅法打开多个不同的Activity处理不同的业务,当这些新Activity关闭后,系统都会调⽤前⾯Activity的onActivityResult(int requestCode, int resultCode, Intent data)⽅法。为了知道返回的数据来⾃于哪个新Activity,在onActiv
ityResult()⽅法中可以这样做(ResultActivity和NewActivity为要打开的新Activity):
public class ResultActivity extends Activity {
.....
ResultActivity.this.setResult(1, intent);
ResultActivity.this.finish();}
public class NewActivity extends Activity {
......
NewActivity.this.setResult(2, intent);
NewActivity.this.finish();}
public class MainActivity extends Activity {
// 在该Activity会打开ResultActivity和NewActivity
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch(resultCode){
case 1:
// ResultActivity的返回数据
case 2:
// NewActivity的返回数据
} }}
3、 意图
Intent提供了⼀种通⽤的消息系统,它允许在你的应⽤程序与其它的应⽤程序间传递Intent来执⾏动作和产⽣事件。使⽤Intent可以激活Android应⽤的三个核⼼组件:活动、服务和⼴播接收器。
Intent可以划分成显式意图和隐式意图。
显式意图:调⽤Intent.setComponent()或Intent.setClass()⽅法明确指定了组件名的Intent为显式意图,显式意图明确指定了Intent应该传递给哪个组件。
隐式意图:没有明确指定组件名的Intent为隐式意图。 Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI 和数据类型)到最合适的组件来处理这个意图。
例:MainActivity中:
public void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.main);
Button button = (Button) this.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction("cn.itcast.lao.li");
intent.setDataAndType(Uri.parse("itcast://www.itcast/person"), "image/gif");
startActivity(intent); }}); }
OtherActivity:
public class OtherActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
setContentView(her); }}
manifest中:
<application android:icon="@drawable/icon" android:label="@string/app_name">
…
…
<activity android:name=".OtherActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="cn.itcast.lao.li" />
<action android:name="cn.itcast.lao.zhang" />
上海传智播客黑马程序员<category android:name="android.intent.category.DEFAULT" />
<category android:name="cn.itcast.category.li" />
<data android:scheme="itcast" android:host="www.itcast"
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论