国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android巧用Fragment解耦onActivityResult詳解

2019-10-21 21:42:03
字體:
來源:轉載
供稿:網友

前言

最近在研究jsbridge, 一直在想怎么樣才能讓需要startActivityForResult比如打開相機拍照這樣的操作在webView中能更簡單一點, 直到我發現了這篇文章

看了之后, 馬上模仿了文中的代碼實現了一下.

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需要一一對應  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需要監聽jsbridge的所有事件我們都在fragment中寫好, 包括onActivityResult中的事件, 當然也可以在這個fragment中用一個專門的管理類來管理注冊的事件.以后Activity中有用到WebView的地方我們就直接用這個WebViewFragment就好了.也就是說, 把這個WebViewFragment, 當成我們之前的WebView.

github地址:

EasyOnActivityResult

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 龙川县| 宁陕县| 呈贡县| 大宁县| 平顺县| 高淳县| 台中市| 大足县| 长海县| 渭源县| 宝应县| 合川市| 金堂县| 蒲城县| 五峰| 即墨市| 上高县| 庆云县| 石河子市| 志丹县| 奉化市| 彩票| 松溪县| 丽江市| 克什克腾旗| 高邮市| 远安县| 屏边| 会东县| 高雄县| 鞍山市| 临猗县| 龙井市| 青田县| 新绛县| 大足县| 黔东| 康平县| 睢宁县| 呼伦贝尔市| 丹凤县|