startActivityForResult和setResult在实际项目中的用法举例

来源:互联网 发布:windows游戏 编辑:程序博客网 时间:2024/05/22 07:22


我们知道startActivityForResult( )startActivity( )而言,不仅可以跳转到下一个activity,而且当被跳转的页面调用finish()后,可以自动跳回最初的activity,并在最初的activity中调用onActivityResult( )方法,获取从被跳转的activity中返回的数据进行相应操作。


在项目中通常有两种情况:

1在跳转后的页面进行相应操作后,数据发生变化,需要回传到上一页改变页面的显示状态。例如首页状态中有对播主的关注状态的显示,当进入详情页进行关注或取消操作,返回首页时相应的发生状态改变。

2跳转后的页面根据前一页传入的数据进行页面的相关展示,在用户操作展示状态后需要将数据返回给上一页,保证再次进入此页时,传入的数据与之前操作的状态一致。例如对播主的关注状态显示在详情页,这一状态根据上一页传来的数据显示,并可以操作取消或关注,当返回上页,再进入详情,要保证跟之前的操作状态显示一致。

 

上述两种情况原理是相似的,只是第一种需要在onActivityResult( )中将返回的数值设置更新后刷新界面,而第二种情况只需要将返回的数值设置更新,确定将要传入下一页的值做出了相应改变即可不用刷新界面,因为展示状态在下一页。这里针对第二种进行具体实现。

 

新闻列表条目显示进详情显示是否收藏,并可进行收藏或取消的操作。(详情的收藏字段根据列表页传入数据获得)

  

在新闻列表页跳转时:

Intent intent = new Intent(context,DetailActivity.class);
intent.putExtra("webUrl",news.get(position).webviewurl);
intent.putExtra("id", news.get(position).tid);
intent.putExtra("title", news.get(position).title);
intent.putExtra("content",news.get(position).title);
intent.putExtra("shareUrl",news.get(position).shareurl);

intent.putExtra("iscollect",Integer.parseInt(news.get(position).isfav));//传入是否收藏字段

startActivityForResult(intent, 1);//请求码1


tip:跳转返回时调用对应页的onActivityResult()方法,在adpter跳转则传参一个当前页过去再跳转,并在当前页复写onActivityResult方法。


例如:

Intent intent = new Intent(context,DetailActivity.class)
intent.putExtra("iscollect","1");
fragment.startActivityForResult(intent,1); //fragment即为创建adpter对象时传参过来的




在详情页操作收藏按钮后:

if ("1".equals(code)) {//点击收藏按钮并请求接口成功
       if (isCollect == -1) {
        isCollect = 1;//之前为收藏状态,访问成功则收藏成功
        iv_store_tie
          .setImageResource(R.drawable.content_collection);
       } else {
        isCollect = -1;//之前为收藏状态,访问成功则取消收藏成功
        iv_store_tie
          .setImageResource(R.drawable.content_uncollection);
       }
       Intent intent = new Intent();
       intent.putExtra("isCollect", isCollect);//将收藏状态返回
       intent.putExtra("id", id);//将此条新闻id返回
       setResult(2, intent);//响应码2
  }


回到新闻列表页,复写onActivityResult方法:

@Override
 public void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  if (requestCode == 1 && resultCode == 2) {//当前请求吗响应码
   for (int i = 0; i < news.size(); i++) {//根据返回id遍历新闻集合将此新闻的收藏状态设置成返回的状态
    if (data.getStringExtra("id").equals(
      String.valueOf(news.get(i).typeid))) {
     news.get(i).isfav = data.getIntExtra("isCollect",
       -1);
    }
   }
   adapter.rest(news);
  } else if (requestCode == 3 && resultCode == 2) {//跳转同一页面的其他请求设置
     ---------
  }
 }

这样就实现了此功能的需求。


此外还有其他方式可实现类似功能:

1广播实现,当详情页状态改变时可以发送广播将相应id的收藏状态设置成新的状态。

2在列表页复写onResume方法,页面返回时刷新数据,但是此方法的弊端是要处理好分页加载的情况,否则每次返回,列表都翻到最开始的条目。





2 0
原创粉丝点击