android fragment解耦,Android巧用Fragment解耦onActivityResult详解

本文介绍了如何通过创建一个名为OnActResultEventDispatcherFragment的Fragment和ActResultRequest类,来简化Android中处理onActivityResult的方法,使得在jsbridge中启动Activity并获取结果变得更加简单。这种方法可以将复杂的回调逻辑集中管理,提高代码的可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android巧用Fragment解耦onActivityResult详解

发布时间:2020-08-27 15:27:32

来源:脚本之家

阅读:93

作者:mundane

前言

最近在研究jsbridge, 一直在想怎么样才能让需要startActivityForResult比如打开相机拍照这样的操作在webView中能更简单一点, 直到我发现了这篇文章

两个类,让你再也不用实现onActivityResult()

看了之后, 马上模仿了文中的代码实现了一下.

Fragment:

public class OnActResultEventDispatcherFragment extends Fragment{

public static final String TAG = "on_act_result_event_dispatcher";

public int mRequestCode = 0x11;

private SparseArray 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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对亿速云的支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值