Android-Activity-startActivityForResult

之前 Android-Intent意图传递数据,的博客讲解了,一个Activity 跳转 到另外一个Activity 可以把数据带过去

Android还提供了一种方式,一个Activity 跳转 到另外一个Activity 可以把数据传递过去,然后还可以把数据返回过来,就需要startActivityForResult

MyActivity1中执行startActivityForResult(intent, 请求码)

然后在MyActivity1重写onActivityResult方法,用于接收返回的信息

package liudeli.activity.intent.result;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;

import java.util.ArrayList;
import java.util.List;

import liudeli.activity.R;
import liudeli.activity.intent.MyApplication;

public class MyActivity1 extends Activity {

    private EditText etItemInfo;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my1);

        etItemInfo = findViewById(R.id.et_item_info);
    }

    public void startMyActivity2(View view) {
        // 绑定数据
        List<String> list = new ArrayList<>();
        for (int i=0; i< 30; i++) {
            list.add("我是一个条目 下标是: " + i);
        }

        // 把数据绑定给Application
        MyApplication myApplication = (MyApplication) getApplication();
        myApplication.list = list;

        Intent intent = new Intent(this, MyActivity2.class);
        startActivityForResult(intent, 500); // 请求码 500
    }

    /**
     * 用来接收 startActivityForResult --> Activity ->setResult(200, intent);
     * @param requestCode startActivityForResult(intent, 500);
     *                    startActivityForResult(intent, 400);
     *                    startActivityForResult(intent, 300);
     *                    startActivityForResult(intent, 310);
     *                    ......
     *                    如果没有requestCode请求码,就没法对业务逻辑进行划分处理
     *                    规范写法是,成对判断: requestCode == 500 && resultCode == 200
     *
     * @param resultCode  setResult(200, intent);
     *                    setResult(210, intent);
     *                    setResult(240, intent);
     *                    setResult(260, intent);
     *                    ......
     *                    如果没有resultCode结果码,就没法对业务逻辑进行划分处理
     *                    规范写法是,成对判断: requestCode == 500 && resultCode == 200
     * @param data
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // 不能用getIntent(),要用data 才能获取到item
        String item = data.getStringExtra("item");

        /*Toast.makeText(this, "requestCode:" + requestCode +
                                          " ,resultCode:" + resultCode +
                                          " ,item:" + item
                , Toast.LENGTH_SHORT).show();*/

        new AlertDialog.Builder(MyActivity1.this)
                .setMessage("requestCode:" + requestCode +
                            " ,resultCode:" + resultCode +
                            " ,item:" + item).setPositiveButton("我知道了", null).show();

        etItemInfo.setText(item + "");

        if (null != item) {
            // 设置光标放在最后
            etItemInfo.setSelection(item.length());
        }

        // 实际正规写法应该是这样:
        // requestCode和startActivityForResult保持一致
        // resultCode和setResult(200) 200 保持一致
        // 如果返回了intent 就需要判断 null != data
        if (requestCode == 500 && resultCode == 200 && null != data) {
            // ... 实际业务逻辑处理
        }
    }
}

MyActivity1的布局文件 activity_my1.xml

在这布局中,重点讲解了,weight 的使用,和理解

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <EditText
            android:id="@+id/et_item_info"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="startMyActivity2"
            android:text="启动My2"
            android:layout_weight="0"
            />

        <!--
            注意:⚠️ android:layout_weight="0" 默认是0,0代表的意思是:我先放入填充显示
            Button layout_weight = "0" 先放入填充显示
            EditText 设置比重为1,后放入显示,然后再 有多少空间给我填充,我就填充多少

            所以说:多使用 比重  和  相对布局,有利于 屏幕的自适配

            layout_weight 涉及到优先放入填充显示
        -->

    </LinearLayout>



</RelativeLayout>

MyActivity1的布局文件 activity_my1.xml 的布局预览:


MyActivity2返回数据,就需要用到 setResult(200, intent); + finish();

package liudeli.activity.intent.result;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.util.List;

import liudeli.activity.R;
import liudeli.activity.intent.MyApplication;

public class MyActivity2 extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my2);

        // 取出数据
        MyApplication myApplication = (MyApplication) getApplication();
        List<String> list = myApplication.list;

        ListView listView = findViewById(R.id.listview);

        // 只有一个数据,简单的展示列表,就采用ArrayAdapter
        final ArrayAdapter arrayAdapter = new ArrayAdapter(this,
                                                     android.R.layout.simple_list_item_1,
                                                     android.R.id.text1,
                                                     list);
        listView.setAdapter(arrayAdapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                // 只返回结果码
                // setResult(200);

                String item = (String) arrayAdapter.getItem(position);

                Intent intent = new Intent();
                intent.putExtra("item", item);

                // 返回结果码,还返回数据,数据用Intent传输
                setResult(200, intent);
                // 一定要finish(); 否则不结束当前MyActivity1,无法返回给MyActivity1
                finish();
            }
        });
    }
}

MyActivity2的布局文件 activity_my2.xml,主要就是一个ListView用来展示列表数据的

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"></ListView>

</RelativeLayout>

 效果:

原文地址:https://www.cnblogs.com/android-deli/p/10110772.html