Android控件使用篇Android专题

onActivityResult方法解析:Intent传递数据,

2020-12-08  本文已影响0人  千夜零一

引言

  我们可能需要实现这样的场景:当前Activity需要单例,即,在该页面执行主流程,比如填写订单,而往往订单需要从其他的Activity中获取相关数据进行组合,方能形成整个订单数据。然而,还需要保证该页面为单例,不能去其他页面获取数据后又生成新页面,造成页面叠加,影响用户体验。
  onActivityResult方法正是为解决这一问题而存在。它得以保证请求前和请求后的Activity为同一个,只是中间通过跳转去其他Activity获取了数据。


效果预览


用法

第一步:创建ActivityA的布局文件

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    tools:context=".blog2.Case67"
    tools:ignore="MissingConstraints">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:background="@color/black"
        android:gravity="center"
        android:text="Activity_A"
        android:textColor="@color/white"
        android:textSize="20sp" />

    <Button
        android:id="@+id/btn_A"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:text="Button_A"
        android:textAllCaps="false"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/showA_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="50dp"
        android:padding="20dp"
        android:text="ceshi:"
        android:textSize="18sp"
        app:layout_constraintTop_toBottomOf="@id/btn_A" />

</androidx.constraintlayout.widget.ConstraintLayout>

第二步:在ActivityA中书写业务逻辑代码

public class Case67 extends AppCompatActivity {
    private TextView tvShowA;
    private Button btnA;
    private String userName;
    private String userId;

    //第三人称说的话
    private String speakenB;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_case67);
        initView();
        userId = "900000000";  //9亿,懂得都懂
        userName = "林更新";
        btnA.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                goToB();
            }
        });
    }

    private void initView() {
        tvShowA = findViewById(R.id.showA_view);
        btnA = findViewById(R.id.btn_A);
    }

    //正戏来啦
        //跳转页面到B
    private void goToB() {
        Intent intent = new Intent(this, Case67Other.class);
        //第一种:直接使用Intent对象传值
        intent.putExtra("Id", userId);
        intent.putExtra("Name", userName);
//        //第二种:通过Bundle对象传值(更佳)
//        Bundle bundle = new Bundle();
//        bundle.putString("Id",userId);
//        bundle.putString("Name",userName);
//        intent.putExtras(bundle)
        startActivityForResult(intent, 200);  //要保证ActivityA为单例,因此不用startActivity()方法,用这个。
    }


        //重写方法onActivityResult():获取从B再跳转到A的结果但仍保证A为跳转到B之前的那个A(单例A)
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 200) {
            if (resultCode == Activity.RESULT_OK) {
                speakenB = data.getStringExtra("speakenB");
                //获取从B传过来的值并展示在按钮下方
                if (speakenB.isEmpty()) {
                    tvShowA.setText("未接收到信息");
                }else {
                    tvShowA.setText(speakenB);
                }
            }
        }
    }
}

第三步:ActivityB布局

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    tools:context=".activity.Case67Other"
    tools:ignore="MissingConstraints">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:background="@color/black"
        android:gravity="center"
        android:text="Activity_B"
        android:textColor="@color/white"
        android:textSize="20sp" />

    <Button
        android:id="@+id/btn_B"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:text="Button_B"
        android:textAllCaps="false"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/showB_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="50dp"
        android:padding="20dp"
        android:text="ceshi:"
        android:textSize="18sp"
        app:layout_constraintTop_toBottomOf="@id/btn_B" />
</androidx.constraintlayout.widget.ConstraintLayout>

第四步:在ActivityB中书写业务逻辑

public class Case67Other extends AppCompatActivity {
    private Button btnB;
    private TextView tvShowB;

    //传递给A一个信息
    private String Bspeak = "他就是一个微博段子手。";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_case67_other);
        initView();
        btnB.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                goToA();
            }
        });
        showText();
    }

    private void initView() {
        btnB = findViewById(R.id.btn_B);
        tvShowB = findViewById(R.id.showB_view);
    }

        //跳转页面到A
    private void goToA(){
        Intent intent = new Intent(this, Case67.class);
        intent.putExtra("speakenB",Bspeak);
        setResult(Activity.RESULT_OK,intent);  //设置返回结果码为RESULT_OK,默认-1
        finish();
    }

        //获取从A传过来的值并展示在按钮下方
    private void showText(){
        Intent intent = getIntent();
        String id = intent.getStringExtra("Id");
        String name = intent.getStringExtra("Name");
        if (id.isEmpty()){
            tvShowB.setText("未接收到的参数:Id,Name");
        }else {
            tvShowB.setText("id:" + id + "name:" + name);
        }
    }
}

大功告成!

上一篇下一篇

猜你喜欢

热点阅读