Fragment萬能容齊

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章