引言:在app中Fragment的使用越来越多,Fragment本身是一个碎片,需要依附于界面也就是Activity,但是写一个新的Fragment就写一个与之相匹配的Activity会增加代码量,所有我就思考着写一个万能的Activity容器界面来加载Fragment
主要代码
public class SubPageTransferActivity extends BaseActivity implements SubPageTransferCallback {
private static final String TAG = "SubPageTransferActivity";
/**
* 跳转到二级中转页面
*
* @param context 当前上下文
* @param fragmentClass 目标页面
* @param bundle 传递的数据
*/
public static void jump(Context context, Class<?> fragmentClass, Bundle bundle) {
jump(context, fragmentClass, bundle, ActivityAnimType.DEFAULT);
}
/**
* 跳转到二级中转页面
*
* @param context 当前上下文
* @param fragmentClass 目标页面
* @param bundle 传递的数据
*/
public static void jump(Context context, Class<?> fragmentClass, Bundle bundle, int jumpAnimType) {
Intent intent = new Intent(context, SubPageTransferActivity.class);
intent.putExtra(BUNDLE_FRAGMENT_CLASS, fragmentClass);
if (bundle != null) {
intent.putExtra(Constants.BUNDLE_BUNDLE, bundle);
}
AppUtil.startActivity(context, intent, jumpAnimType);
}
/**
* 跳转到二级中转页面
*
* @param context 当前上下文
* @param fragmentClass 目标页面
* @param bundle 传递的数据
* @param requestCode 跳转回掉的Code
*/
public static void jumpForResult(Context context, Class<?> fragmentClass, Bundle bundle, int requestCode) {
Intent intent = new Intent(context, SubPageTransferActivity.class);
intent.putExtra(BUNDLE_FRAGMENT_CLASS, fragmentClass);
if (bundle != null) {
intent.putExtra(Constants.BUNDLE_BUNDLE, bundle);
}
AppUtil.startActivityForResult(context, intent, requestCode);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
Class<?> fragmentClass = (Class) intent.getSerializableExtra(BUNDLE_FRAGMENT_CLASS);
if (fragmentClass != null) {
try {
Fragment fragmentInstance = (Fragment) fragmentClass.newInstance();
Bundle bundle = intent.getBundleExtra(Constants.BUNDLE_BUNDLE);
fragmentInstance.setArguments(bundle);
getSupportFragmentManager().beginTransaction()
.replace(R.id.fl_container, fragmentInstance, TAG)
.commitAllowingStateLoss();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
Fragment fragment = getSupportFragmentManager().findFragmentByTag(TAG);
if (fragment instanceof OnBackListener) {
OnBackListener onBackListener = (OnBackListener) fragment;
onBackListener.onBackClickEvent();
return true;
}
}
return super.onKeyDown(keyCode, event);
}
}
**代码分析**
1、主要逻辑就是在onCreate方法中通过反射获取Fragment的名称(通过Intent传递过来的参数),然后设置Fragment对应的Bundle参数,然后通过事务提交给FragmentManager就可以了。
2、重写onKeyDown方法中的KeyEvent.KEYCODE_BACK事件通过Tag获取到界面添加的Fragment,如果Fragment实现OnBackListener接口,就调用OnBackListener.onBackClickEvent()方法,将返回键的事件传递个Fragment,可以让Fragment在操作返回键监时候做一些自己的操作,仅仅是添加操作,并不拦截返回键事件。