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

Android巧用Fragment解耦onActivityResult詳解

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

前言

最近在研究jsbridge, 一直在想怎么樣才能讓需要startActivityForResult比如打開(kāi)相機(jī)拍照這樣的操作在webView中能更簡(jiǎn)單一點(diǎn), 直到我發(fā)現(xiàn)了這篇文章

兩個(gè)類(lèi),讓你再也不用實(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)聽(tīng)jsbridge的所有事件我們都在fragment中寫(xiě)好, 包括onActivityResult中的事件, 當(dāng)然也可以在這個(gè)fragment中用一個(gè)專(zhuān)門(mén)的管理類(lèi)來(lái)管理注冊(cè)的事件.以后Activity中有用到WebView的地方我們就直接用這個(gè)WebViewFragment就好了.也就是說(shuō), 把這個(gè)WebViewFragment, 當(dāng)成我們之前的WebView.

github地址:

EasyOnActivityResult

總結(jié)

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

相關(guān)文章

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

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

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

    Android studio 快捷鍵大全

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

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

    我有一個(gè)文本輸入對(duì)話(huà)框,當(dāng)我點(diǎn)擊對(duì)話(huà)框上的“是”按鈕,它會(huì)驗(yàn)證輸入,然后關(guān)閉對(duì)話(huà)框,但是,如果輸入錯(cuò)誤,我想停留在同一個(gè)對(duì)話(huà)框中。怎么實(shí)現(xiàn)此功能呢?下面通過(guò)本文給大家分享下
    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開(kāi)發(fā)

    如何在Android Studio下進(jìn)行NDK開(kāi)發(fā)

    這篇文章主要介紹了如何在Android Studio下進(jìn)行NDK開(kāi)發(fā),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(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的方法,以及如何允許用戶(hù)去修改并能夠記住用戶(hù)的選擇
    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)和布局文件的常見(jiàn)問(wèn)題等方面,需要的朋友可以參考下
    2023-07-07

最新評(píng)論

河间市| 固安县| 常州市| 澄江县| 怀远县| 隆昌县| 承德县| 武义县| 定陶县| 陵川县| 博乐市| 景宁| 富阳市| 英山县| 皋兰县| 永德县| 宁蒗| 平远县| 北京市| 堆龙德庆县| 井冈山市| 赣州市| 邢台县| 莱阳市| 昌平区| 将乐县| 庐江县| 秭归县| 城市| 微山县| 乌兰县| 正镶白旗| 松阳县| 汾西县| 赞皇县| 额济纳旗| 城口县| 石屏县| 迭部县| 乌兰浩特市| 镇江市|