最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android巧用Fragment解耦onActivityResult詳解

 更新時(shí)間:2018年08月06日 10:57:18   作者:mundane  
這篇文章主要給大家介紹了關(guān)于Android巧用Fragment解耦onActivityResult的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

最近在研究jsbridge, 一直在想怎么樣才能讓需要startActivityForResult比如打開相機(jī)拍照這樣的操作在webView中能更簡(jiǎn)單一點(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需要一一對(duì)應(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();
 }
}

按照這樣的思路, 如果需要簡(jiǎn)化jsbridge中startActivityForResult的操作, 我們只需要把Fragment和WebView綁定在一起.比如給這個(gè)Fragment取名叫WebViewFragment, 它的布局中只有一個(gè)我們封裝好的WebView, 這個(gè)WebView需要監(jiān)聽jsbridge的所有事件我們都在fragment中寫好, 包括onActivityResult中的事件, 當(dāng)然也可以在這個(gè)fragment中用一個(gè)專門的管理類來管理注冊(cè)的事件.以后Activity中有用到WebView的地方我們就直接用這個(gè)WebViewFragment就好了.也就是說, 把這個(gè)WebViewFragment, 當(dāng)成我們之前的WebView.

github地址:

EasyOnActivityResult

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Android實(shí)現(xiàn)保持屏幕常亮功能

    Android實(shí)現(xiàn)保持屏幕常亮功能

    本篇文章主要介紹了Android實(shí)現(xiàn)保持屏幕常亮功能,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-11-11
  • Android studio 快捷鍵大全

    Android studio 快捷鍵大全

    android studio使用教程,主要為大家介紹的是android studio快捷鍵,如果我們掌握了一些常用快捷鍵,那么在使用android studio的過程中會(huì)達(dá)到事半功倍的效果哦
    2016-01-01
  • AlertDialog點(diǎn)擊按鈕不消失的實(shí)現(xiàn)方法

    AlertDialog點(diǎn)擊按鈕不消失的實(shí)現(xiàn)方法

    我有一個(gè)文本輸入對(duì)話框,當(dāng)我點(diǎn)擊對(duì)話框上的“是”按鈕,它會(huì)驗(yàn)證輸入,然后關(guān)閉對(duì)話框,但是,如果輸入錯(cuò)誤,我想停留在同一個(gè)對(duì)話框中。怎么實(shí)現(xiàn)此功能呢?下面通過本文給大家分享下
    2017-01-01
  • Android實(shí)現(xiàn)QQ側(cè)滑(刪除、置頂?shù)?功能

    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ā)

    這篇文章主要介紹了如何在Android Studio下進(jìn)行NDK開發(fā),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • Android實(shí)現(xiàn)計(jì)時(shí)器功能

    Android實(shí)現(xiàn)計(jì)時(shí)器功能

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)計(jì)時(shí)器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • android預(yù)置默認(rèn)的語(yǔ)音信箱號(hào)碼具體實(shí)現(xiàn)

    android預(yù)置默認(rèn)的語(yǔ)音信箱號(hào)碼具體實(shí)現(xiàn)

    在此介紹以xml的方式預(yù)置VM number的方法,以及如何允許用戶去修改并能夠記住用戶的選擇
    2013-06-06
  • Android使用SoundPool實(shí)現(xiàn)播放音效

    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)

    Android自定義ViewPagerIndicator實(shí)現(xiàn)炫酷導(dǎo)航欄指示器(ViewPager+Fragment)

    這篇文章主要為大家詳細(xì)介紹了Android自定義ViewPagerIndicator實(shí)現(xiàn)炫酷導(dǎo)航欄指示器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • 常用Android布局文件優(yōu)化技巧總結(jié)

    常用Android布局文件優(yōu)化技巧總結(jié)

    Android布局加載是Android應(yīng)用程序的重要組成部分,布局加載是指將 XML文件中定義的視圖層次結(jié)構(gòu)加載到內(nèi)存中,在這篇文章中,我們將深入探討 Android 布局加載的原理,包括 Android 布局文件的結(jié)構(gòu)和布局文件的常見問題等方面,需要的朋友可以參考下
    2023-07-07

最新評(píng)論

海门市| 遂宁市| 开封县| 石家庄市| 略阳县| 谷城县| 福鼎市| 确山县| 红原县| 绥棱县| 桂阳县| 车致| 枣阳市| 延长县| 桦川县| 扎鲁特旗| 潢川县| 东宁县| 河津市| 宜黄县| 全南县| 济宁市| 石河子市| 井陉县| 新绛县| 荣昌县| 宾川县| 西畴县| 垫江县| 嘉善县| 离岛区| 姚安县| 霍邱县| 墨玉县| 吉首市| 佛山市| 明光市| 黑河市| 台前县| 惠州市| 杨浦区|