Android巧用Fragment解耦onActivityResult詳解
前言
最近在研究jsbridge, 一直在想怎么樣才能讓需要startActivityForResult比如打開相機(jī)拍照這樣的操作在webView中能更簡單一點, 直到我發(fā)現(xiàn)了這篇文章
兩個類,讓你再也不用實現(xiàn)onActivityResult()
看了之后, 馬上模仿了文中的代碼實現(xiàn)了一下.
Fragment:
public class OnActResultEventDispatcherFragment extends Fragment{ public static final String TAG = "on_act_result_event_dispatcher"; public int mRequestCode = 0x11; 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) { // mRequestCode與callback需要一一對應(yīng) mCallbacks.put(mRequestCode, callback); startActivityForResult(intent, mRequestCode); mRequestCode++; } @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); } } }
ActResultRequest:
public class ActResultRequest { private OnActResultEventDispatcherFragment fragment; public ActResultRequest(FragmentActivity activity) { fragment = getEventDispatchFragment(activity); } private OnActResultEventDispatcherFragment getEventDispatchFragment(FragmentActivity activity) { FragmentManager fragmentManager = activity.getSupportFragmentManager(); 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); } }
MainActivity:
public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void start(View view) { Intent intent = new Intent(this, SecondActivity.class); ActResultRequest request = new ActResultRequest(this); request.startForResult(intent, new ActResultRequest.Callback() { @Override public void onActivityResult(int resultCode, Intent data) { Log.d(TAG, "resultCode = " + resultCode); String name = data.getStringExtra("name"); Log.d(TAG, "name = " + name); Toast.makeText(MainActivity.this, "name = " + name + ", resultCode = " + resultCode, Toast.LENGTH_SHORT).show(); } }); } }
SecondActivity
public class SecondActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); } public void returnResult(View view) { Intent intent = new Intent(); intent.putExtra("name", "mundane"); setResult(RESULT_OK, intent); finish(); } }
按照這樣的思路, 如果需要簡化jsbridge中startActivityForResult的操作, 我們只需要把Fragment和WebView綁定在一起.比如給這個Fragment取名叫WebViewFragment, 它的布局中只有一個我們封裝好的WebView, 這個WebView需要監(jiān)聽jsbridge的所有事件我們都在fragment中寫好, 包括onActivityResult中的事件, 當(dāng)然也可以在這個fragment中用一個專門的管理類來管理注冊的事件.以后Activity中有用到WebView的地方我們就直接用這個WebViewFragment就好了.也就是說, 把這個WebViewFragment, 當(dāng)成我們之前的WebView.
github地址:
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
如何使用Matrix對bitmap的旋轉(zhuǎn)與鏡像水平垂直翻轉(zhuǎn)
本篇文章是對使用Matrix對bitmap的旋轉(zhuǎn)與鏡像水平垂直翻轉(zhuǎn)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06Android webView如何輸出自定義網(wǎng)頁
這篇文章主要介紹了Android webView如何輸出自定義網(wǎng)頁,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09Android實現(xiàn)MVVM架構(gòu)數(shù)據(jù)刷新詳解流程
MVVM架構(gòu)模式,即Model-View-ViewModel三個層級,MVVM模式出來的時間已經(jīng)很長了,網(wǎng)上關(guān)于MVVM模式的解析也有很多,我這里只說一下我自己的理解,基本上是和MVP模式相比較的一個差異2021-10-10使用Docker來加速構(gòu)建Android應(yīng)用的基本部署思路解析
這篇文章主要介紹了使用Docker來加速構(gòu)建Android應(yīng)用的部署思路解析,在服務(wù)器中通過Docker鏡像來獲得更高效的開發(fā)和測試流程,需要的朋友可以參考下2016-01-01Android Activity Results API代替onActivityResul
說到onActivityResult,我們已經(jīng)非常熟悉來,通過在A activity啟動B activity并且傳入數(shù)據(jù)到B中,然后在A中通過onActivityResult來接收B中返回的數(shù)據(jù)。在最新的activity-ktx的beta版本中,谷歌已經(jīng)廢棄了onActivityResult2022-09-09Android項目中g(shù)radle的執(zhí)行流程
大家好,本篇文章主要講的是Android項目中g(shù)radle的執(zhí)行流程,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下2022-01-01android實現(xiàn)raw文件夾導(dǎo)入數(shù)據(jù)庫代碼
這篇文章主要介紹了android實現(xiàn)raw文件夾導(dǎo)入數(shù)據(jù)庫代碼,有需要的朋友可以參考一下2013-12-12Android RecyclerView實現(xiàn)下拉刷新和上拉加載
這篇文章主要介紹了Android RecyclerView實現(xiàn)下拉刷新和上拉加載的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-05-05