Android巧用Fragment解耦onActivityResult詳解
前言
最近在研究jsbridge, 一直在想怎么樣才能讓需要startActivityForResult比如打開相機(jī)拍照這樣的操作在webView中能更簡單一點(diǎn), 直到我發(fā)現(xiàn)了這篇文章
兩個(gè)類,讓你再也不用實(shí)現(xiàn)onActivityResult()
看了之后, 馬上模仿了文中的代碼實(shí)現(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綁定在一起.比如給這個(gè)Fragment取名叫WebViewFragment, 它的布局中只有一個(gè)我們封裝好的WebView, 這個(gè)WebView需要監(jiān)聽jsbridge的所有事件我們都在fragment中寫好, 包括onActivityResult中的事件, 當(dāng)然也可以在這個(gè)fragment中用一個(gè)專門的管理類來管理注冊的事件.以后Activity中有用到WebView的地方我們就直接用這個(gè)WebViewFragment就好了.也就是說, 把這個(gè)WebViewFragment, 當(dāng)成我們之前的WebView.
github地址:
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
AlertDialog點(diǎn)擊按鈕不消失的實(shí)現(xiàn)方法
我有一個(gè)文本輸入對話框,當(dāng)我點(diǎn)擊對話框上的“是”按鈕,它會驗(yàn)證輸入,然后關(guān)閉對話框,但是,如果輸入錯誤,我想停留在同一個(gè)對話框中。怎么實(shí)現(xiàn)此功能呢?下面通過本文給大家分享下2017-01-01
Android實(shí)現(xiàn)QQ側(cè)滑(刪除、置頂?shù)?功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)QQ側(cè)滑刪除、置頂?shù)裙δ?,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12
如何在Android Studio下進(jìn)行NDK開發(fā)
這篇文章主要介紹了如何在Android Studio下進(jìn)行NDK開發(fā),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
Android實(shí)現(xiàn)計(jì)時(shí)器功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)計(jì)時(shí)器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04
android預(yù)置默認(rèn)的語音信箱號碼具體實(shí)現(xiàn)
在此介紹以xml的方式預(yù)置VM number的方法,以及如何允許用戶去修改并能夠記住用戶的選擇2013-06-06
Android使用SoundPool實(shí)現(xiàn)播放音效
這篇文章主要為大家詳細(xì)介紹了Android使用SoundPool實(shí)現(xiàn)播放音效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11
Android自定義ViewPagerIndicator實(shí)現(xiàn)炫酷導(dǎo)航欄指示器(ViewPager+Fragment)
這篇文章主要為大家詳細(xì)介紹了Android自定義ViewPagerIndicator實(shí)現(xiàn)炫酷導(dǎo)航欄指示器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02

