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