引言:在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在操作返回鍵監時候做一些自己的操作,僅僅是添加操作,並不攔截返回鍵事件。