1. 程式人生 > >startActivityForResult和setResult在實際專案中的用法舉例

startActivityForResult和setResult在實際專案中的用法舉例



我們知道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方法,頁面返回時重新整理資料,但是此方法的弊端是要處理好分頁載入的情況,否則每次返回,列表都翻到最開始的條目。