• 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>

     效果:

  • 相关阅读:
    【转】如何复制一个正在使用的文件?(VB6.0)
    VB6.0操作SQL Server——增删改查
    SQL Server时间戳并发 .
    WCF WinCE 中 手机端 非字符串型 datetime,int,decimal,double 等等 传递不到WCF端的解决方案
    VB中调用带参数存储过程的实现(数据库)
    C# VB6.0 Java C++ GUID 生成
    vb6.0 取得文件扩展名
    VB6.0 取得windows 临时目录 temp
    VB6.0 在代码中直接调用 文件打开对话框,不使用windows控件
    VB数据库记录查询四法
  • 原文地址:https://www.cnblogs.com/android-deli/p/10110772.html
Copyright © 2020-2023  润新知