Android中兩個類讓你再也不用實現(xiàn)onActivityResult()
前言
當我們知道fragment僅僅可以收到自己請求的回調后,我們就可以用它來解耦activity中onActivityResult的邏輯了。一般情況下,如果一個activity中多個回調結果的話,onActivityResult()中會有各種case判斷,并且這種設計也打斷了流式寫法。那么我們索性建立一個無UI的fragment做精準的接收器,這樣就可以再也不寫onActivityResult()了。
Fragment:
/**
* @author Kale
* @date 2018/4/13
*/
public class OnActResultEventDispatcherFragment extends Fragment {
public static final String TAG = "on_act_result_event_dispatcher";
private SparseArray<ActResultRequest.Callback> mCallbacks = new SparseArray<>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
public void startForResult(Intent intent, ActResultRequest.Callback callback) {
mCallbacks.put(callback.hashCode(), callback);
startActivityForResult(intent, callback.hashCode());
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
ActResultRequest.Callback callback = mCallbacks.get(requestCode);
mCallbacks.remove(requestCode);
if (callback != null) {
callback.onActivityResult(resultCode, data);
}
}
}
請求封裝類:
public class ActResultRequest {
private OnActResultEventDispatcherFragment fragment;
public ActResultRequest(Activity activity) {
fragment = getEventDispatchFragment(activity);
}
private OnActResultEventDispatcherFragment getEventDispatchFragment(Activity activity) {
final FragmentManager fragmentManager = activity.getFragmentManager();
OnActResultEventDispatcherFragment fragment = findEventDispatchFragment(fragmentManager);
if (fragment == null) {
fragment = new OnActResultEventDispatcherFragment();
fragmentManager
.beginTransaction()
.add(fragment, OnActResultEventDispatcherFragment.TAG)
.commitAllowingStateLoss();
fragmentManager.executePendingTransactions();
}
return fragment;
}
private OnActResultEventDispatcherFragment findEventDispatchFragment(FragmentManager manager) {
return (OnActResultEventDispatcherFragment) manager.findFragmentByTag(OnActResultEventDispatcherFragment.TAG);
}
public void startForResult(Intent intent, Callback callback) {
fragment.startForResult(intent, callback);
}
public interface Callback {
void onActivityResult(int resultCode, Intent data);
}
}
發(fā)送請求和監(jiān)聽請求的代碼:
Intent intent = new Intent(this, SecondActivity.class);
request.startForResult(intent, new ActResultRequest.Callback() {
@Override
public void onActivityResult(int resultCode, Intent data) {
Toast.makeText(MainActivity.this, "" + resultCode, Toast.LENGTH_SHORT).show();
}
});
題外話:
最新的support包已經解決了fragment嵌套時里層的fragment收不到結果的問題,請及時更新依賴。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
Android禁止EditText自動彈出軟鍵盤的方法及遇到問題
這篇文章主要介紹了Android禁止EditText自動彈出軟鍵盤的方法及遇到問題,需要的朋友可以參考下2018-07-07
Kotlin協(xié)程Job生命周期結構化并發(fā)詳解
這篇文章主要為大家介紹了Kotlin協(xié)程Job生命周期結構化并發(fā)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12
android編程獲取和設置系統(tǒng)鈴聲和音量大小的方法
這篇文章主要介紹了android編程獲取和設置系統(tǒng)鈴聲和音量大小的方法,實例分析了Android針對音頻的相關操作技巧,需要的朋友可以參考下2017-06-06
Android實現(xiàn)圓形ProgressBar停止轉動的方法詳解
這篇文章主要為大家詳細介紹了Android實現(xiàn)圓形ProgressBar停止轉動方法的相關知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2024-03-03
詳解如何在Android Studio中添加RecyclerView-v7支持包
本篇文章主要介紹了詳解如何在Android Studio中添加RecyclerView-v7支持包,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-02-02
Android巧用DecorView實現(xiàn)對話框功能
本篇文章主要介紹了Android巧用DecorView實現(xiàn)對話框功能,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04
Android App中實現(xiàn)圖片異步加載的實例分享
這篇文章主要介紹了Android App中實現(xiàn)圖片異步加載的實例分享,這樣GridView在加載大量圖片時便可以延時分布顯示,需要的朋友可以參考下2016-04-04

