您的位置:首页 > 其它

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

2017-03-14 16:13 274 查看


我们知道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方法,页面返回时刷新数据,但是此方法的弊端是要处理好分页加载的情况,否则每次返回,列表都翻到最开始的条目。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: