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

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

总结

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 中,Fragment 也可以通过 startActivityForResult() 方法启动另外一个 Activity,并通过 onActivityResult() 方法接收返回的数据。在 Fragment 中使用 startActivityForResult() 方法时,要注意以下几点: 1. 需要在 Fragment 中重写 onActivityResult() 方法,而不是在 Fragment 所依附的 Activity 中重写。 2. 在 Fragment 中启动 Activity 时,需要使用 getActivity().startActivityForResult() 方法,而不是直接使用 startActivityForResult() 方法。 3. 在 Fragment 中接收返回数据时,需要调用 getActivity().onActivityResult() 方法,而不是直接调用 FragmentonActivityResult() 方法。 例如,以下是一个在 Fragment 中使用 startActivityForResult() 方法的示例: ``` public class MyFragment extends Fragment { private static final int REQUEST_CODE = 100; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment_my, container, false); } public void startMyActivity() { Intent intent = new Intent(getActivity(), MyActivity.class); startActivityForResult(intent, REQUEST_CODE); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK) { String result = data.getStringExtra("result"); // 处理返回数据 } } @Override public void onResume() { super.onResume(); if (getActivity() instanceof MyActivity) { ((MyActivity) getActivity()).setResult(Activity.RESULT_OK, new Intent().putExtra("result", "Hello World!")); getActivity().finish(); } } } ``` 在上面的示例中,我们在 Fragment 中启动了一个名为 MyActivity 的 Activity,并在 Activity 中模拟了返回数据的操作。当 Activity 被销毁时,会自动回调 FragmentonActivityResult() 方法,我们可以在该方法中接收返回的数据并进行处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值