• Android中实现activity的页面跳转并传值


    一个Android应用程序很少会只有一个Activity对象,如何在多个Activity之间进行跳转,而且能够互相传值是一个很基本的要求。

    本次我们就讲一下,Android中页面跳转以及传值的几种方式!

    Activity跳转与传值,主要是通过Intent类来连接多个Activity.

     

    1. Intent显式意图

     

    (1) 最常见最一般的页面跳转代码,很简单,如下:

    Intent intent = new Intent(A.this, SecondActivity.class);
    startActivity(intent);

    也可以这样写:

    Intent intent = new Intent(); 
    intent.setClass(A.this, SecondActivity.class);
    startActivity(intent);

    (2) 当然,你需要新建一个SecondActivity的界面,并继承activity,重写onCreate方法:

    1 public class SecondActivity extends Activity {
    2 
    3     @Override
    4     protected void onCreate(Bundle savedInstanceState) {
    5         super.onCreate(savedInstanceState);
    6         setContentView(R.layout.activity_second);
    7     }
    8     
    9 }

    (3) 当然新建了一个activity后记得在清单文件中进行注册.

    (4) 在onCreate方法里设置布局文件: R.layout.activity_second,所以需要在res目录下新建

    这样就可以使用显示意图实现页面跳转了.

    2.隐式意图

    隐式意图与显式意图在写法上有以下几点不一样:

    (1) 在清单文件中注册需要加意图过滤器

     1 <activity android:name="com.example.intent.SecondActivity">
     2             <intent-filter >
     3                 
     4                 <action android:name="com.google.open02"/>
     5                 
     6                 <!-- 一般配置 隐式意图 的时候就需要写 category
     7                     表示用在 默认的设备中 (默认的运行在 手机中 的)  -->
     8                     
     9                 <category android:name="android.intent.category.DEFAULT"></category>
    10                 
    11                 <data android:scheme="haha" />
    12                 <data android:mimeType="image/jpeg"/>
    13                 <data android:host="www.google.com"/>
    14             </intent-filter>
    15         </activity>

    (2) 在创建Intent对象时:

    1 Intent intent = new Intent();
    2         
    3 intent.setAction("com.google.open02");
    4 
    5 intent.addCategory("android.intent.category.DEFAULT");
    6         
    7 intent.setDataAndType(Uri.parse("haha://www.google.com"), "image/jpeg");
    8         
    9 startActivity(intent);

    这里需要注意一点:

    data和type可以单独使用,但是他俩是互斥的

    也就是说,使用了data就不能使用type,这个看API可以知道

    如果想同时使用他俩的话,就需要用setDataAndType方法

    注意: 隐式意图必须包含动作(action),以及数据(data)

    3. 显式意图和隐式意图的区别

    • 显式意图: 一般用于激活应用程序内部的
    • 隐式意图: 一般用于激活其他应用程序的组件

    4. 数据传递

    (1) 要想实现在页面跳转的同时传递数据,只需要用一个方法即可:putExtra()

    1 Intent intent = new Intent(this, SecondActivity.class);
    2 intent.putExtra("name", et_name.getText()+"");
    3 startActivity(intent);

    (2) 如果要传递复杂一点的数据,如图片:

    putExtra可以传递一个Parcelable对象,而图片的bitmap是Parcelable的子类

    所以可以这样操作:

    1 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.logo);
    2 intent.putExtra("pic", bitmap);

    5. 数据接收

    1 // 首先获取到意图对象
    2 Intent intent = getIntent();
    3 
    4 // 获取到传递过来的姓名
    5 String name = intent.getStringExtra("name");
    6 
    7 // 获取到传递过来的图片
    8 Bitmap bitmap = intent.getParcelableExtra("pic");

    6. startActivityForResult

    如果用正向传递的方式是可以实现数据的回归的,但是这样做的坏处是开启了很多个Activity累积到栈中,当点击返回的时候就会逐一打开之前的Activity,这样的用户
    体验是非常不好的,所以通过数据的反向传递的方式保证Activity只有当前的一个,当用户点击返回时可以直接退出。

    下面以一种需求为例,讲解startActivityForResult,发送短信小助手:

    用户点击"选择模板"跳到短信模板的界面,然后点击某一条短信,直接将选择的短信返回到页面中

    主界面:

    选择模板短信的界面:

    选择联系人界面:

    这里的列表是用listview来做的,点击对应的listview可以将结果返回到主界面中.

    以下是两个按钮点击事件的代码:

    
    
     1 /**
     2      * 选择短信模板
     3      * @param view
     4      */
     5     public void selectSms(View view){
     6         //点击后跳转到短信模板界面
     7         Intent intent = new Intent(this, SmsActivity.class);
     8         
     9         //两个参数:Intent intent 意图对象
    10         //int requestCode 请求码
    11         startActivityForResult(intent, 2);
    12     }
    13     /**
    14      * 选择收信人
    15      */
    16     public void addContacts(View view) {
    17         // 点击后跳到联系人列表界面
    18         Intent intent = new Intent(this, ContactsActivity.class);
    19         
    20         //为了一个结果 去启动另外的一个 activity 界面 
    21         startActivityForResult(intent, 1);
    22     }

    注意: 还需要重写onActivityResult()方法,来接收返回的数据

    示例代码如下:

     1 @Override
     2     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     3         super.onActivityResult(requestCode, resultCode, data);
     4 
     5         // resultCode : 结果码, 用来鉴别 到底是  哪个 结果 ...
     6         if (data != null) {
     7             if (resultCode == 1) {// 说明是联系人的返回结果
     8                 contact = data.getStringExtra("contact");
     9                 et_contact.setText(contact);
    10             }else if(resultCode == 2){//说明是短信模板的返回结果
    11                 sms = data.getStringExtra("sms");
    12                 et_content.setText(sms);
    13             }
    14         }
    15     }

    以下是短信模板的示例代码:

     1 public class SmsActivity extends Activity {
     2 
     3     String [] sms = {"短信1","短信2","短信3","短信4"};
     4     @Override
     5     protected void onCreate(Bundle savedInstanceState) {
     6         super.onCreate(savedInstanceState);
     7         setContentView(R.layout.activity_sms);
     8         
     9         ListView lv_sms = (ListView) findViewById(R.id.lv_sms);
    10         
    11         lv_sms.setAdapter(new ArrayAdapter<String>(this, R.layout.item_sms, sms));
    12         
    13         lv_sms.setOnItemClickListener(new OnItemClickListener() {
    14 
    15             @Override
    16             public void onItemClick(AdapterView<?> parent, View view,
    17                     int position, long id) {
    18                 
    19                 String template = sms[position];
    20                 
    21                 Intent data = new Intent();
    22                 
    23                 data.putExtra("sms", template);
    24                 
    25                 //int resultCode, 结果码,用于区分到底是哪个的返回数据
    26                 //Intent data 
    27                 setResult(2, data);
    28                 
    29                 finish();
    30             }
    31         });
    32     }
    33     
    34 }

    好了,关于页面跳转就先介绍到这里.

     

  • 相关阅读:
    KVM快速构建虚拟机
    工程师测试
    配置SMB,NFS
    Shell脚本基础应用
    Web网页部署
    基础邮件,mariadb数据库
    SElinux,firewalld配置
    Linux管理员测试
    磁盘分区
    配置权限,LDAP
  • 原文地址:https://www.cnblogs.com/wanghaoyuhappy/p/5292291.html
Copyright © 2020-2023  润新知