• Activity之间传递参数(四)


    --------siwuxie095

       

       

       

    获取Activity的返回参数

       

       

    1、首先修改两个布局文件,都修改为 LinearLayout 布局,

    添加orientation属性为:vertical。

    1)为 activity_main.xml 添加一个 TextView,用于显示返回的数据

    <?xml version="1.0" encoding="utf-8"?>

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:id="@+id/activity_main"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:paddingBottom="@dimen/activity_vertical_margin"

    android:paddingLeft="@dimen/activity_horizontal_margin"

    android:paddingRight="@dimen/activity_horizontal_margin"

    android:paddingTop="@dimen/activity_vertical_margin"

    android:orientation="vertical"

    tools:context="com.siwuxie095.sendargs.MainActivity">

       

       

    <TextView

    android:text="TextView"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:id="@+id/textView"

    android:layout_weight="1" />

       

    <Button

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:id="@+id/btnStartAty"

    android:text="启动另一个Activity"/>

       

    </LinearLayout>

       

       

    (2)为 activity_the_aty.xml 添加一个 EditText 和 Button,分别用于 输入

    返回数据 点击返回第一个Activity

    <?xml version="1.0" encoding="utf-8"?>

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:id="@+id/activity_the_aty"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:paddingBottom="@dimen/activity_vertical_margin"

    android:paddingLeft="@dimen/activity_horizontal_margin"

    android:paddingRight="@dimen/activity_horizontal_margin"

    android:paddingTop="@dimen/activity_vertical_margin"

    android:orientation="vertical"

    tools:context="com.siwuxie095.sendargs.TheAty">

       

    <TextView

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:text="Hello World"

    android:id="@+id/tv"/>

       

    <EditText

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:inputType="textPersonName"

    android:text="Name"

    android:ems="10"

    android:id="@+id/editText" />

       

    <Button

    android:text="Send Back"

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:id="@+id/button" />

       

    </LinearLayout>

       

       

       

    2、在 TheAty.java 中,添加 editText的声明和定义,为Button添加鼠标响应事件

    package com.siwuxie095.sendargs;

       

    import android.content.Intent;

    import android.support.v7.app.AppCompatActivity;

    import android.os.Bundle;

    import android.view.View;

    import android.widget.EditText;

    import android.widget.TextView;

       

    public class TheAty extends AppCompatActivity {

       

       

    private TextView tv;

    private EditText editText;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_the_aty);

       

    //TheAty是通过MainActivity中的Intent启动,直接通过getIntent()方法

    //获取与这个Activity相关的Intent

    Intent i=getIntent();

       

       

    // //在第二个Activity TheAty 获取Bundle

    //// Bundle data=i.getExtras();

    // Bundle data=i.getBundleExtra("data");

    //要访问TextView,先在上面声明

    //findViewById()的返回值在编译时只能查看到类型是View,而事实上是TextView类型

    //需要强制类型转换

    tv= (TextView) findViewById(R.id.tv);

    //tv

    editText= (EditText) findViewById(R.id.editText);

       

       

    // //调用setText()方法设置字符串,这里字符串通过Intent获取

    // tv.setText(i.getStringExtra("data"));

    // 需要做一个强制类型转换

    // User user= (User) i.getSerializableExtra("user");

    //不需要强制类型转换

    User user=i.getParcelableExtra("user");

    //直接通过setText()方法传入字符串即可

    tv.setText(String.format("User Info(name = %s, age = %d)",user.getName(),user.getAge()));

       

    // //用到了String.format()

    // // 假如有一个不存在的数据namex

    // // 那么getString()有一个重载函数可以设置默认值

    // tv.setText(String.format("name = %s, age = %d, namex = %s",data.getString("name"),data.getInt("age"),data.getString("namex","Mary")));

    findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {

    Intent i=new Intent();

    i.putExtra("data",editText.getText().toString());

       

    //setResult() 设置返回值:可设置返回状态码和返回数据(可重载)

    //不同状态码代表不同意义MainActivity中可以根据传回的状态码

    //判断发回数据的状态

    setResult(1,i);

       

    //结束当前Activity

    finish();

       

    }

    });

    }

    }

       

       

       

    3、在 MainActivity.java 中,startActivity()被替换,同时重写函数 onActivityResult()

    package com.siwuxie095.sendargs;

       

    import android.content.Intent;

    import android.support.v7.app.AppCompatActivity;

    import android.os.Bundle;

    import android.view.View;

    import android.widget.TextView;

       

    public class MainActivity extends AppCompatActivity {

       

    private TextView textView;

       

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

       

    //需要强制类型转换

    textView= (TextView) findViewById(R.id.textView);

       

    findViewById(R.id.btnStartAty).setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {

    //创建一个new Intent()实例,传入ContextClass类型的参数

    //对应MainActivity.this 被启动的Activity的类定义 TheAty.class

    Intent i = new Intent(MainActivity.this,TheAty.class);

       

    // //通过Intent对象,调用putExtra()方法,传参

    // //这里传入StringString类型的参数,实际上就是键值对

    // i.putExtra("data","你好我是传递的参数");

       

    // //传递数据包要用到Bundle,通过Bundle存入多种类型数据,传给第二个Activity

    // Bundle b=new Bundle();

    // //b.putBundle(); Bundle也可以嵌入Bundle

    // b.putString("name","Jack");

    // b.putInt("age",22);

    // //putExtras() 传入Bundle

    //// i.putExtras(b);

    // //除了通过putExtras()传,还能用下面的putExra()

    // i.putExtra("data",b);

       

    i.putExtra("user",new User("Bill",18));

       

    // //传入i

    // startActivity(i);

       

    //若要接收到TheAty传回的参数,不能使用startActivity(i)

    //要使用下面的函数,接收传回的参数

    //requestCode 请求代码传给第二个Activity 由第二个Activity再传回

    //通过请求代码确定此次请求的意义

    startActivityForResult(i,0);

    }

    });

    }

       

    //重写函数 onActivityResult() 有请求码和结果码

    // 通过请求码判断请求的意义通过结果码判断结果数据的状态

    //第三个参数Intent的数据来源于TheAtysetRsult()的第二个参数

    @Override

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    super.onActivityResult(requestCode, resultCode, data);

    textView.setText("另一个Activity返回的数据是:"+data.getStringExtra("data"));

    }

    }

       

       

       

    4、User.java 不变

    package com.siwuxie095.sendargs;

       

    import android.os.Parcel;

    import android.os.Parcelable;

       

    import java.io.Serializable;

       

    /**

    * Created by siwux on 2017/1/2.

    */

       

    //public class User implements Serializable{

    public class User implements Parcelable{

    private String name;

    private int age;

       

    public String getName() {

    return name;

    }

       

    public void setName(String name) {

    this.name = name;

    }

       

    public int getAge() {

    return age;

    }

       

    public void setAge(int age) {

    this.age = age;

    }

       

    public User(String name, int age) {

    this.name = name;

    this.age = age;

    }

       

    //第一个方法不用管

    @Override

    public int describeContents() {

    return 0;

    }

       

    //向目标destParcel里写数据因为Parcelable没有全自动序列化机制需要手动写

    //将数据保存起来方便传递给其他程序或Activity

    @Override

    public void writeToParcel(Parcel dest, int flags) {

    dest.writeString(getName());

    dest.writeInt(getAge());

    }

       

    //还需创建一个Creator,泛型是User

    public static final Creator<User> CREATOR = new Creator<User>() {

    //createFromParcel() 通过一个Parcel来创建对象

    @Override

    public User createFromParcel(Parcel source) {

    //直接返回一个new User()

    // User中如果数据过多,也可以打包成Bundle

    // 直接writeBundle() readBundle()即可

    return new User(source.readString(),source.readInt());

    }

       

       

    @Override

    public User[] newArray(int size) {

    return new User[size];

    }

    }; //注意这里还要加分号

    }

       

       

       

       

    5、工程结构目录一览:

       

       

       

    6、运行结果一览:

       

       

       

       

       

    【made by siwuxie095】

  • 相关阅读:
    团队作业——需求分析
    团队作业——UML设计
    第三次个人作业——用例图设计
    团队项目——介绍文档
    团队集结
    第二次结对作业
    第一次结对作业
    解决Mac中anaconda作图中文异常显示的问题
    《软件工程》——回顾过去 展望未来
    第三次个人作业——用例图设计
  • 原文地址:https://www.cnblogs.com/siwuxie095/p/6243005.html
Copyright © 2020-2023  润新知