Android学习之Activity传参
一、传参的三种方法
场景分两步:
1、从第一个Activity传递参数到第二个Activity,接受并显示。
2、第二个Activity文本框输入信息,并传到第一个Activity。
传参前需要先定义Intent
Intent i=new Intent(MainActivity.this,TheAty.class);//参数一当前Activity,参数二跳转Activity
传参的集中方法
1、putExtra
类似是键值对,第二个参数可以传不同类型的值
a)赋值
i.putExtra("data","Hellow,zhangsan");
b)取值
i.getStringExtra("data")
2、使用Bundle
根据类型不同使用不同的put方法
a)赋值
Bundle b=new Bundle(); b.putString("name","hello,张三");
i.putExtras(b);
b)取值:
Bundle data=i.getExtras(); data.getString("name");
3、使用对象
a)定义一个User对象,包含name和age属性
public class User implements Parcelable{ private String name; private int age; public int GetAge(){ return this.age; } public void SetAge(int age){ this.age=age; } public String GetName(){ return this.name; } public void SetName(String name){ this.name=name; } public User(String name,int age){ this.name=name; this.age=age; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int i) { dest.writeString(GetName()); dest.writeInt(GetAge()); } public static final Creator<User> CREATOR=new Creator<User>() { @Override public User createFromParcel(Parcel source) { return new User(source.readString(),source.readInt()); } @Override public User[] newArray(int size) { return new User[size]; } }; }
这里采用Android的Parcelable序列号接口,重写describeContents和writeToParcel方法,定义常量CREATOR。当然也可以用Java的Serializable接口,实现代码更少。
b)传参
i.putExtra("user",new User("zhangsan",18));
c)取值
User u=(User)i.getParcelableExtra("user");
tv.setText(String.format("User info(name=%s,age=%d)",u.GetName(),u.GetAge()));
二、实现的代码和步骤:1、先定义第一个Activity
加上button和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:orientation="vertical" 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" tools:context="com.example.lisheng.sendargs.MainActivity"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/btnStartAty" android:text="启动另一个Activtiy"/> <TextView android:text="" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/textView" /> </LinearLayout>
2、第一个Activity后代码台实现
public class MainActivity extends AppCompatActivity { private TextView textView;//定义TextView @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView=(TextView)findViewById(R.id.textView);//根据ID获得TextView对象 findViewById(R.id.btnStartAty).setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View view) { Intent i=new Intent(MainActivity.this,TheAty.class); i.putExtra("user",new User("zhangsan",18)); startActivityForResult(i,0); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); textView.setText("返回的数据:"+data.getStringExtra("data")); } }
这里需要注意的有点
1)获得元素是根据元素ID findViewById(R.id.textView);
2)给Button绑定点击事件: setOnClickListener(new View.OnClickListener(){}
3)要想获取第二个Activity返回的值,需要重写onActivityResult方法
3、第二个Activity页面
定一个TextView用于显示接受第一个传来的值;定义一个EditText,写入值;定义一个Button;
<?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:orientation="vertical" 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" tools:context="com.example.lisheng.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>
4、第二个Activity后台代码实现
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); Intent i= getIntent(); tv= (TextView) findViewById(R.id.tv); editText=(EditText)findViewById(R.id.editText); User u=(User)i.getParcelableExtra("user");//获取传入的User对象 tv.setText(String.format("User info(name=%s,age=%d)",u.GetName(),u.GetAge()));//显示到TextView findViewById(R.id.button).setOnClickListener(new View.OnClickListener(){ //定义Button点击事件 @Override public void onClick(View view) { Intent i=new Intent(); i.putExtra("data",editText.getText().toString()); setResult(1,i); finish(); } }); } }
运行下,大功告成。