我们通过一个小案例来看一下Activity的数据是怎么请求和回传的
首先我们有一个主界面点下按钮之后打开另外一个Activity并要求这个Activity返回一个数据,数据返回之后主窗体再对数据进行处理。
先把主到页面和代码放一下
- 效果图:
- 代码文件下载:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.a16041.app_zhuangbei.MainActivity">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="45dp"
android:layout_gravity="center_horizontal"
android:src="@mipmap/baby"/>
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="人物属性"
android:textSize="18sp" />
<TableLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-->>>>>>>>>>>>>>>>>>>>1<<<<<<<<<<<<<<<<<<<<<<<<-->
<TableRow
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="25dp"
>
<TextView
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="生命值:"
/>
<ProgressBar
android:id="@+id/progressBar1"
style="?android:attr/progressBarStyleHorizontal"
android:layout_weight="3"
android:layout_width="0dp"
android:layout_marginLeft="20dp"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/life"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_marginLeft="20dp"
android:layout_height="wrap_content"
android:text="0"
/>
</TableRow>
<!-->>>>>>>>>>>>>>>>>>>>2<<<<<<<<<<<<<<<<<<<<<<<<-->
<TableRow
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="25dp"
>
<TextView
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="攻击力:"
/>
<ProgressBar
android:id="@+id/progressBar2"
style="?android:attr/progressBarStyleHorizontal"
android:layout_weight="3"
android:layout_width="0dp"
android:layout_marginLeft="20dp"
android:layout_height="wrap_content" />
<TextView
android:layout_weight="1"
android:layout_width="0dp"
android:layout_marginLeft="20dp"
android:layout_height="wrap_content"
android:text="0"
android:id="@+id/atk"
/>
</TableRow>
<!-->>>>>>>>>>>>>>>>>>>>3<<<<<<<<<<<<<<<<<<<<<<<<-->
<TableRow
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="25dp"
>
<TextView
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="敏捷度:"
/>
<ProgressBar
android:id="@+id/progressBar3"
style="?android:attr/progressBarStyleHorizontal"
android:layout_weight="3"
android:layout_width="0dp"
android:layout_marginLeft="20dp"
android:layout_height="wrap_content" />
<TextView
android:layout_weight="1"
android:layout_width="0dp"
android:layout_marginLeft="20dp"
android:layout_height="wrap_content"
android:text="0"
android:id="@+id/quick"
/>
</TableRow>
</TableLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="15dp"
android:layout_gravity="center_horizontal"
>
<Button
android:id="@+id/zhu"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableRight="@android:drawable/ic_menu_add"
android:onClick="onClick1"
android:text="购买装备" />
</LinearLayout>
</LinearLayout>
- clss:
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.edu.domain.info;
public class MainActivity extends AppCompatActivity {
private ProgressBar p1;
private ProgressBar p2;
private ProgressBar p3;
private TextView t1;
private TextView t2;
private TextView t3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//找到控件
p1 = (ProgressBar) findViewById(R.id.progressBar1);
p2 = (ProgressBar) findViewById(R.id.progressBar2);
p3 = (ProgressBar) findViewById(R.id.progressBar3);
t1 = (TextView) findViewById(R.id.life);
t2 = (TextView) findViewById(R.id.atk);
t3 = (TextView) findViewById(R.id.quick);
Button btn1=(Button)findViewById(R.id.zhu);
btn1.setOnClickListener(new MyListener());
p1.setMax(1000);
p2.setMax(1000);
p3.setMax(1000);
//p1.setProgress(200);
}
class MyListener implements View.OnClickListener {
public void onClick(View v) {
Intent intent =new Intent(MainActivity.this,shoppingActivity.class);
startActivityForResult(intent ,1);//要求打开的窗体返回一个数据
}
}
//购买完毕后执
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (data != null) {
if (resultCode == 10) {
if (requestCode == 1) {
//info info =(info)data.getExtras().get("info");
info info = (info) data.getSerializableExtra("info");
//更新
updateProgressBar(info);
}
}
}
}
private void updateProgressBar(info info) {
System.out.println("调用了update");
//获取原进度
int pro1 = p1.getProgress();
int pro2 = p2.getProgress();
int pro3 = p3.getProgress();
//更新进度
p1.setProgress(pro1+info.getLife());
p2.setProgress(pro2+info.getAttack());
p3.setProgress(pro3+info.getQuick());
//更新TextView
t1.setText(p1.getProgress()+"");
t2.setText(p2.getProgress()+"");
t3.setText(p3.getProgress()+"");
}
}
解释:主要代码↓
Intent intent =new Intent(MainActivity.this,shoppingActivity.class);
startActivityForResult(intent ,1);//要求打开的窗体返回一个数据
我们创建一个打开shoppingActivityIntent(意图),然后用 startActivityForResult(Intent intent, Int requestCode);开启这个意图并设置一个requestCode(请求码)要求这个Activity带一返回值。
转到shoppingActivity
点击布局时会触发Onclick事件
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.edu.domain.info;
/**
* Created by 16041 on 2017/3/26.
*/
public class shoppingActivity extends Activity {
info info;
protected void onCreate( Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_shop);
RelativeLayout layout=(RelativeLayout)findViewById(R.id.rl);
layout.setOnClickListener(new MyListener());
//初始化显示数据
info = new info("金剑",20,100,20);
//找控件
TextView tv_name =(TextView) findViewById(R.id.tv_name);
TextView tv_life =(TextView) findViewById(R.id.tv_life);
TextView tv_attack =(TextView) findViewById(R.id.tv_attack);
TextView tv_speed =(TextView) findViewById(R.id.tv_speed);
//数据显示在控件上
tv_name.setText(info.getName());
tv_life.setText("攻击力:"+info.getAttack());
tv_attack.setText("敏捷度:"+info.getQuick());
tv_speed.setText("生命值:"+info.getLife());
}
class MyListener implements View.OnClickListener {
public void onClick(View v) {
switch (v.getId()){
case R.id.rl:
//System.out.println("返回了!");
Intent intent =new Intent();
intent.putExtra("info",info);
//把结果返回
setResult(10,intent);
finish();
break;
default:
break;
}
}
}
}
- 触发事件时判断点击的是否是id为rl的布局如果是就进入选择语句:
Intent intent =new Intent();
intent.putExtra("info",info);
setResult(10,intent);
finish();
break;
创建一个Intent (意图)用intent.putExtra()方法来储存我们想要返回的值;
利用setResult(int resultCode, Intent intent);设置一个返回码 和返回的意图。现在要用 finish();关闭当前的Activity然后返回这个Intent 。
- 回到MainActivity.class
- 用下面的方法来接受并处理返回内容:
protected void onActivityResult(int requestCode, int resultCode, Intent data)
if (resultCode == 10) { //验证返回码
if (requestCode == 1) { //验证请求码
//执行操作获取存入的数据
info info = (info) data.getSerializableExtra("info");
//调用我们写好的类将回传的数据更新到Activity中
updateProgressBar(info);
}
}
- 效果图: