2021-09-30 Android界面跳转并返回数据

场景

Android界面A显示的是数据列表界面,点击界面中的一项时跳转到详情界面B。A跳转到B后A界面不销毁还在任务栈中,在B界面中可以选择不操作直接返回,还可以选择删除这个数据再返回。最后都是B界面销毁显示A界面。不同的是如果在B界面中不做操作,那么返回A界面时数据列表不用变化,但是如果删除了这个数据返回的A界面,那么A界面中的列表是需要刷新的。

A界面中刷新数据列表方案

笔者在编码时遇到这种去情况,首先想到的是刚刚点击去的这个数据项不是被删除了吗?怎么返回来还在列表中呢,理所当然这个列表中的数据已经在内存中,在详情界面删除的是后台的数据,其实数据列表中的数据还在的。当时笔者的做法是在A界面中的onResume()函数中再重新请求数据列表,这样请求的新的数据列表中是没有了刚刚删除的那个数据。看起来是解决了数据刷新问题,但是如果数据列表是用户刷新了很多页的数据,如果在这里删除了一个数据,刷新数据列表,那用户又得从头开始看,这种体验不好。这里的时候笔者首先想到的是记录翻页的数据,重新刷新数据时加载到这个位置,但是想了一下就觉得麻烦,肯定要控制几个变量,编码太繁琐,不是首选方案,于是想到了在界面跳转中传递数据,由B界面告诉A界面是否删除了哪一项数据,返回后在A界面中拿到结果,在内存的数据列表中移除这一项数据不就OK了吗。

B界面返回操作结果A界面刷新数据列表

在不需要返回结果时界面跳转的代码是context.startActivity(intent);:这种方式跳转界面只是在A中携带了一个数据到B,B并不能返回数据给A。JOIN_TAG_NOTE 是在B中定义的一个tag,用来做数据传递的标识,PatrolNote note是A界面传递到B界面的一个数据对象,这个对象需要实现Serializable接口才能被序列化。这是在B界面中的静态函数,有B界面提供的进入B界面的函数,这种写法利于解耦。

public static final String JOIN_TAG_NOTE = "join_tag_note";

public static void join(Context context, PatrolNote note) {
    Intent intent = new Intent(context, PatrolNoteInfoActivity.class);
    intent.putExtra(JOIN_TAG_NOTE, note);
    context.startActivity(intent);
}

现在我们需要在A跳转到B,B返回一个结果给A,所以需要修改界面跳转代码如下:REQUEST_CODE_DELETE 是在A界面中定义的一个请求码,用来在返回结果时确定是由这个请求码返回的数据。这个代码是在A界面中执行,自己携带数据跳转到B界面。

public static final int REQUEST_CODE_DELETE = 1;

Intent intent = new Intent(getActivity(), PatrolNoteInfoActivity.class);
intent.putExtra(PatrolNoteInfoActivity.JOIN_TAG_NOTE, note);
startActivityForResult(intent, REQUEST_CODE_DELETE);

这样做以后就可以在A界面中重写onActivityResult()函数,这个函数中可以再返回这个界面时拿到返回的数据,其中requestCode就是跳转之前使用的请求码,用来区别拿到的是请求的哪一个数据,resultCode是结果码,由返回界面定义,data就是用来传递返回数据的Intent对象。通过requestCode和resultCode可以确定是不是你想要的那一个结果,因为一个界面中可以通过很多界面去拿数据。值得注意的是onActivityResult()函数也可以在Fragment中重写,一样能拿到返回的数据。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
        case REQUEST_CODE_DELETE:
            switch (resultCode) {
                case PatrolNoteInfoActivity.RESULT_CODE_DELETE:
                    long deleteId = data.getLongExtra(PatrolNoteInfoActivity.JOIN_TAG_NOTE, -1);
                    //TODO 业务逻辑
                    break;
            }
            break;
    }
}

当一个界面进入另一个界面需要另一个界面退出返回数据时,在另一个界面退出之前可以设置一个结果,只有设置了结果,跳转之前的界面onActivityResult()函数才能拿到结果。如下代码所示,在界面退出之前调用setResult()函数,这里必须传一个结果码,用结果码区分返回的结果类型,这个结果码程序员根据业务自己定义。也可以传一个Intent,intent用来携带数据,如果业务相对简单只是用结果码就可以完成业务逻辑就可以不用传intent,笔者这里的业务是返回是否删除了某项数据,如果删除的话就把删除数据的id传回去。所以需要返回2个数据,一个是是否删除的标记,另一个是当删除的时候那个数据的id。所以是否删除的标记可以用结果码来定义,删除的数据id使用intent来传递。

Intent resultIntent = new Intent();
resultIntent.putExtra(JOIN_TAG_NOTE, note.getId());
setResult(RESULT_CODE_DELETE, resultIntent);
finish();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值