Android中兩個(gè)類讓你再也不用實(shí)現(xiàn)onActivityResult()
前言
當(dāng)我們知道fragment僅僅可以收到自己請求的回調(diào)后,我們就可以用它來解耦activity中onActivityResult的邏輯了。一般情況下,如果一個(gè)activity中多個(gè)回調(diào)結(jié)果的話,onActivityResult()中會有各種case判斷,并且這種設(shè)計(jì)也打斷了流式寫法。那么我們索性建立一個(gè)無UI的fragment做精準(zhǔn)的接收器,這樣就可以再也不寫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包已經(jīng)解決了fragment嵌套時(shí)里層的fragment收不到結(jié)果的問題,請及時(shí)更新依賴。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
Android禁止EditText自動(dòng)彈出軟鍵盤的方法及遇到問題
這篇文章主要介紹了Android禁止EditText自動(dòng)彈出軟鍵盤的方法及遇到問題,需要的朋友可以參考下2018-07-07
Kotlin協(xié)程Job生命周期結(jié)構(gòu)化并發(fā)詳解
這篇文章主要為大家介紹了Kotlin協(xié)程Job生命周期結(jié)構(gòu)化并發(fā)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
android編程獲取和設(shè)置系統(tǒng)鈴聲和音量大小的方法
這篇文章主要介紹了android編程獲取和設(shè)置系統(tǒng)鈴聲和音量大小的方法,實(shí)例分析了Android針對音頻的相關(guān)操作技巧,需要的朋友可以參考下2017-06-06
Android實(shí)現(xiàn)圓形ProgressBar停止轉(zhuǎn)動(dòng)的方法詳解
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)圓形ProgressBar停止轉(zhuǎn)動(dòng)方法的相關(guān)知識,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03
詳解如何在Android Studio中添加RecyclerView-v7支持包
本篇文章主要介紹了詳解如何在Android Studio中添加RecyclerView-v7支持包,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02
Android巧用DecorView實(shí)現(xiàn)對話框功能
本篇文章主要介紹了Android巧用DecorView實(shí)現(xiàn)對話框功能,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04
關(guān)于Android冷啟動(dòng)耗時(shí)優(yōu)化詳解
大家好,本篇文章主要講的是關(guān)于Android冷啟動(dòng)耗時(shí)優(yōu)化詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下2022-01-01
Android App中實(shí)現(xiàn)圖片異步加載的實(shí)例分享
這篇文章主要介紹了Android App中實(shí)現(xiàn)圖片異步加載的實(shí)例分享,這樣GridView在加載大量圖片時(shí)便可以延時(shí)分布顯示,需要的朋友可以參考下2016-04-04

