android 跨模块调用fragment
时间: 2023-08-04 17:16:38 浏览: 107
在 Android 中,要想跨模块调用 Fragment,可以使用以下几种方式:
1. 通过接口回调:在 Fragment 所在的模块中定义一个接口,调用方实现该接口并将实现类传递给 Fragment 所在的模块,在 Fragment 中调用实现类中的方法。
2. 通过广播通知:通过广播发送数据,接收方注册广播接收器并接收数据,在接收到数据后使用 FragmentManager 在需要的地方替换 Fragment。
3. 通过 ARouter 实现跨模块调用:ARouter 是阿里巴巴开源的一款 Android 路由框架,可以实现模块间的跨越调用,包括跨模块调用 Fragment。
具体实现方式如下:
1. 通过接口回调实现:
在 Fragment 所在的模块中定义一个接口,例如:
```java
public interface OnFragmentInteractionListener {
void onFragmentInteraction(Uri uri);
}
```
在实现该接口的 Activity 或 Fragment 中实现该接口,并将实现类传递给 Fragment 所在的模块,例如:
```java
public class MainActivity extends AppCompatActivity implements OnFragmentInteractionListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Fragment fragment = new MyFragment();
((MyFragment) fragment).setOnFragmentInteractionListener(this);
getSupportFragmentManager().beginTransaction()
.replace(R.id.container, fragment)
.commit();
}
@Override
public void onFragmentInteraction(Uri uri) {
// TODO: 处理 Fragment 回调
}
}
```
在 Fragment 中调用接口中的方法,例如:
```java
public class MyFragment extends Fragment {
private OnFragmentInteractionListener mListener;
public void setOnFragmentInteractionListener(OnFragmentInteractionListener listener) {
mListener = listener;
}
private void doSomething() {
// TODO: 处理业务逻辑
mListener.onFragmentInteraction(Uri.parse("something"));
}
// ...
}
```
2. 通过广播通知实现:
在 Fragment 所在的模块中发送广播,例如:
```java
Intent intent = new Intent("my_action");
intent.putExtra("data", "hello world");
LocalBroadcastManager.getInstance(getContext()).sendBroadcast(intent);
```
在需要接收广播的 Activity 或 Fragment 中注册广播接收器,例如:
```java
public class MainActivity extends AppCompatActivity {
private MyFragment mFragment;
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String data = intent.getStringExtra("data");
if (mFragment != null) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.container, mFragment);
transaction.commit();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mFragment = new MyFragment();
IntentFilter filter = new IntentFilter("my_action");
LocalBroadcastManager.getInstance(this).registerReceiver(mReceiver, filter);
// ...
}
// ...
@Override
protected void onDestroy() {
super.onDestroy();
LocalBroadcastManager.getInstance(this).unregisterReceiver(mReceiver);
}
}
```
在 Fragment 中替换 Fragment,例如:
```java
public class MyFragment extends Fragment {
// ...
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.container, new AnotherFragment());
transaction.commit();
}
};
@Override
public void onResume() {
super.onResume();
IntentFilter filter = new IntentFilter("my_action");
LocalBroadcastManager.getInstance(getContext()).registerReceiver(mReceiver, filter);
}
@Override
public void onPause() {
super.onPause();
LocalBroadcastManager.getInstance(getContext()).unregisterReceiver(mReceiver);
}
// ...
}
```
3. 通过 ARouter 实现跨模块调用:
在需要调用的 Fragment 所在的模块中定义一个路由路径,例如:
```java
@Route(path = "/test/fragment")
public class TestFragment extends Fragment {
// ...
}
```
在调用方模块中使用 ARouter 跳转到需要调用的 Fragment,例如:
```java
ARouter.getInstance().build("/test/fragment").navigation();
```
在 Application 中初始化 ARouter,例如:
```java
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
ARouter.init(this);
}
}
```
阅读全文