Activity经典实例:启动其他Activity并使用Bundle存储数组返回结果

本文介绍Android应用中不同Activity之间如何通过startActivityForResult进行数据传递的方法。包括如何在启动Activity时携带参数,以及如何在返回时将结果传回原Activity。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述:

如果启动另一个Activity,并且希望返回结果给当前的Activity,那么可使用startActivityForResult()方法,在这种情况下,也是通过Bundle来进行数据交换的。

为了获取到被启动的Activity,当前的Activity要重写onActivityResult(int requestCode, int resultCode, Intent intent)方法,其中参数1代表请求码,参数2代表返回的结果码,由开发者根据业务需要自定义。

一个Activity中可能包含多个按钮,并调用多个startActivityForResult()方法来打开多个不同的Activity处理不同的业务。当这些新的Activity关闭后,系统都会回调前面那个Activity的onActivityResult()方法。为了知道该方法是由哪个请求的结果所触发的,可利用requestCode请求码;为了知道返回的数据来自于哪个新的Activity,可利用resultCode结果码。


一、项目实例:

在第二个Activity里让用户选择所在地,并将选择的结果返回给第一个Activity


完整代码:

ForResultActivity.java

packagecom.xsjayz.ac;
 
importandroid.app.Activity;
importandroid.content.Intent;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
importandroid.widget.EditText;
 
publicclass ForResultActivity extendsActivity {
 
    privateButton button;
    privateEditText cityEdit;
 
    @Override
    publicvoid onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        button = (Button) findViewById(R.id.btn);
        cityEdit = (EditText) findViewById(R.id.city_edit);
 
        button.setOnClickListener(newOnClickListener() {
            @Override
            publicvoid onClick(View v) {
                Intent intent = newIntent(ForResultActivity.this,
                        SecondActivity.class);
                // 启动对应的Activity,并等待返回的结果,其中0为请求码(requestCode),用于标识该请求。
                startActivityForResult(intent,0);
            }
        });
    }
 
    /**
     * 重写onActivityResult()方法:以回调的方式来获取指定Activity返回的结果。
     */
    @Override
    protectedvoid onActivityResult(intrequestCode, intresultCode,
            Intent intent) {
        // 当requestCode和resultCode都为0时(处理特定的结果)。
        if(requestCode == 0&& resultCode == 0) {
             
            Bundle bundleData = intent.getExtras();
            String resultCity = bundleData.getString("city");
            cityEdit.setText(resultCity);
        }
    }
 
}



?

SecondActivity.java

packagecom.xsjayz.ac;
 
importandroid.app.ExpandableListActivity;
importandroid.content.Intent;
importandroid.os.Bundle;
importandroid.view.Gravity;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.AbsListView;
importandroid.widget.BaseExpandableListAdapter;
importandroid.widget.ExpandableListAdapter;
importandroid.widget.ExpandableListView;
importandroid.widget.ExpandableListView.OnChildClickListener;
importandroid.widget.ImageView;
importandroid.widget.LinearLayout;
importandroid.widget.TextView;
 
publicclass SecondActivity extendsExpandableListActivity {
 
    privateString[] provinces = newString[] { "上海","江西","浙江"};
    privateString[][] cities = newString[][] { { "徐汇","黄浦","浦东"},
            {"上饶","萍乡","南昌"}, { "嘉兴","绍兴","杭州"} };
 
    @Override
    publicvoid onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        /**
         * ExpandableListAdapter
         */
        ExpandableListAdapter adapter = newBaseExpandableListAdapter() {
            @Override
            publicboolean isChildSelectable(intgroupPosition,
                    intchildPosition) {
                returntrue;
            }
 
            @Override
            publicboolean hasStableIds() {
                returntrue;
            }
 
            // 该方法决定每个组选项的外观
            @Override
            publicView getGroupView(intgroupPosition, booleanisExpanded,
                    View convertView, ViewGroup parent) {
 
                LinearLayout linearLayout = newLinearLayout(
                        SecondActivity.this);
                linearLayout.setOrientation(0);
                ImageView logo = newImageView(SecondActivity.this);
                linearLayout.addView(logo);
                TextView textView = getTextView();
                textView.setText(getGroup(groupPosition).toString());
                linearLayout.addView(textView);
 
                returnlinearLayout;
            }
 
            @Override
            publiclong getGroupId(intgroupPosition) {
 
                returngroupPosition;
            }
 
            @Override
            publicint getGroupCount() {
 
                returnprovinces.length;
            }
 
            // 获取指定组位置处的组数据
            @Override
            publicObject getGroup(intgroupPosition) {
 
                returnprovinces[groupPosition];
            }
 
            @Override
            publicint getChildrenCount(intgroupPosition) {
 
                returncities[groupPosition].length;
            }
 
            // 该方法决定每个子选项的外观
            @Override
            publicView getChildView(intgroupPosition, intchildPosition,
                    booleanisLastChild, View convertView, ViewGroup parent) {
 
                TextView textView = getTextView();
                textView.setText(getChild(groupPosition, childPosition)
                        .toString());
 
                returntextView;
            }
 
            @Override
            publiclong getChildId(intgroupPosition, intchildPosition) {
 
                returnchildPosition;
            }
 
            // 获取指定组位置、指定子列表项处的子列表项数据
            @Override
            publicObject getChild(intgroupPosition, intchildPosition) {
 
                returncities[groupPosition][childPosition];
            }
 
            privateTextView getTextView() {
 
                AbsListView.LayoutParams lp = newAbsListView.LayoutParams(
                        ViewGroup.LayoutParams.FILL_PARENT,64);
                TextView textView = newTextView(SecondActivity.this);
                textView.setLayoutParams(lp);
                textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
                textView.setPadding(60,0,0,0);
                textView.setTextSize(20);
 
                returntextView;
            }
        };
 
        // 设置该窗口显示列表
        setListAdapter(adapter);
        getExpandableListView().setOnChildClickListener(
                newOnChildClickListener() {
                    @Override
                    publicboolean onChildClick(ExpandableListView parent,
                            View v, intgroupPosition, intchildPosition,
                            longid) {
                        // 获取启动该Activity的上一个Activity对应的Intent
                        Intent intent = getIntent();
                        Bundle data = newBundle();
                        data.putString("city",
                                cities[groupPosition][childPosition]);
                        intent.putExtras(data);
                        // 设置SecondActivity的结果码(resultCode),并设置在当前结束后退回去的Activity
                        SecondActivity.this.setResult(0, intent);
                        SecondActivity.this.finish();
                        returnfalse;
                    }
                });
    }
}


?

main.xml

<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal">
 
    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/set_city_btn"/>
 
    <EditText
        android:id="@+id/city_edit"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:editable="false"
        android:hint="@string/city_edit"/>
 
</LinearLayout>



二、问题

今天在写这段代码的时候,遇到一个纳闷的问题:

1、从A跳转到B

// 从AActivity跳转到BActivity,并传递参数过去
Intent intent = newIntent(AActivity.this,BActivity.class);
intent.putExtra("path", filterImgPath);
startActivityForResult(intent,REQUEST_CODE_GETIMAGE_FILTER);

?

2、在B处接收从A传递的数据,没有问题

?
getIntent().getStringExtra("path");

3、在B处理完成后,返回到A的过程,触发A的onActivityResult()方法

// 完成
doneButton.setOnClickListener(newView.OnClickListener() {
    @Override
    publicvoid onClick(View v) {
        Intent intent = getIntent();
 
        // 情形1
        // Bundle bundle = new Bundle();
        // bundle.putString("filterPath", mNewPath);
 
        // 情形2
        intent.putExtra("filterPath", mNewPath);
 
        ImageFilterActivity.this.setResult(RESULT_OK, intent);
        ImageFilterActivity.this.finish();
    }
});


?

4、在A处的onActivityResult()里

elseif (requestCode == REQUEST_CODE_GETIMAGE_FILTER) {
 
    // 情形1,获得的bundle 不为null,但是newPath为null
    // Bundle bundle = data.getExtras();
    // String newPath = bundle.getString("filterPath");
 
    // 情形2,newPath不为null
    String newPath = data.getStringExtra("filterPath");
}


5、问题应该处在3,即3里面采用new一个Bundle对象来传递数据,这个Bundle应该没有和Intent对象关联,导致的结果就是在4里获得的Bundle对象不是3里的Bundle对象。

 


转载地址:http://my.oschina.net/xsjayz/blog/77049?fromerr=KfrLlQKA


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值