从头开始搭建你的Android项目(2)- 创建管理碎片的Activity基类

通常我们会创建一系列的Base基类,如BaseManager、BaseApi、BaseActivity、BaseFragment、BaseAdapter等等。创建Base的好处多多,如规范代码逻辑、减少重复代码、方便复用。。。

言归正传,我们开始。

BaseFragmentActivity

1、创建一个抽象类BaseFragmentActivity继承AppCompatActivity。

2、定义初始化相关的抽象方法:

   /**
     * 设置布局
     * @return layout id
     */
    protected abstract int setLayoutId();

    /**
     * 初始化bundle
     */
    protected abstract void initBundle();

    /**
     * 初始化界面
     **/
    protected abstract void initView();

    /**
     * 初始化数据
     */
    protected abstract void initData();

在生命周期中onCreate中依次调用

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(setLayoutId());
        initBundle();
        initView();
        initData();
        ctx = this;
    }

3、实现作为一个容器的价值——管理碎片Fragment

(1)定义变量:

private final int container = R.id.container; //在ids.xml中定义

/**
 * back fragment list.
 */
private ArrayList<BaseFragment> fragments;

/**
 * current fragment.
 */
private BaseFragment fragment;

(2)向Activity容器中首次加入碎片

    /**
     * 向Activity中首次加入碎片.
     *
     * @param fragment       新碎片的实例.
     * @param addToBackStack 是否将该碎片加入返回堆栈.
     */
    public void addContent(BaseFragment fragment, boolean addToBackStack) {
        initFragments();

        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.add(container, fragment);
        if (addToBackStack) {
            ft.addToBackStack(null);
        } else {
            removePrevious();
        }

        ft.commitAllowingStateLoss();
        getSupportFragmentManager().executePendingTransactions();

        fragments.add(fragment);
        setFragment();
    }

    /**
     * 初始化碎片列表.
     */
    private void initFragments() {
        if (fragments == null) {
            fragments = new ArrayList<>();
        }
    }

    /**
     * 设置当前的碎片.
     */
    private void setFragment() {
        if (fragments != null && fragments.size() > 0) {
            fragment = fragments.get(fragments.size() - 1);
        } else {
            fragment = null;
        }
    }


(3)替换容器中的碎片

    /**
     * 替换Activity容器中的碎片.
     *
     * @param fragment
     * @param addToBackStack
     */
    public void replaceContent(BaseFragment fragment, boolean addToBackStack) {
        initFragments();

        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.replace(container, fragment);
        if (addToBackStack) {
            ft.addToBackStack(null);
        } else {
            removePrevious();
        }
        ft.commitAllowingStateLoss();
        getSupportFragmentManager().executePendingTransactions();

        fragments.add(fragment);
        setFragment();
    }

(4)碎片回退操作

    /**
     * 回退到上一个碎片展示.
     */
    public void removeContent() {
        removePrevious();
        setFragment();

        getSupportFragmentManager().popBackStackImmediate();
    }

    /**
     * 从堆栈中移除上一个
     */
    private void removePrevious() {
        if (fragments != null && fragments.size() > 0) {
            fragments.remove(fragments.size() - 1);
        }
    }

    /**
     * 退回到首个碎片展示
     */
    public void backTopFragment() {
        if (fragments != null && fragments.size() > 1) {
            removeContent();
            backTopFragment();
        }
    }

4、Activity堆栈管理

onCreate中push

HActivityManager.getScreenManager().pushActivity(this);

onDestory中pop

HActivityManager.getScreenManager().popActivity(this);

[注]这里用到的HActivityManager封装自定义的核心库模块中,mavenCentral地址提供给大家:

implementation 'com.redapplenet:HuicentCoreLibrary:1.0.3-rc3' 

BaseFragment

作为碎片的基类,相比容器的基类就简单很多了。

直接贴代码

package com.huicent.library.bases;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * Fragment基础类
 *
 * @author wu
 * @date 2018/5/7
 */
public abstract class BaseFragment extends Fragment {

    protected Activity mActivity;
    protected Context mContext;

    /**
     * 布局id
     *
     * @return
     */
    protected abstract int setLayoutId();

    /**
     * 初始化界面
     *
     * @param view
     * @param savedInstanceState
     */
    protected abstract void initView(View view, Bundle savedInstanceState);

    /**
     * 初始化数据
     *
     * @param savedInstanceState
     */
    protected abstract void initData(Bundle savedInstanceState);

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mActivity = (Activity) context;
        mContext = context;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(setLayoutId(), container, false);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        initView(view, savedInstanceState);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        initData(savedInstanceState);
    }

}

总结

BaseFragmentActivity主要实现了管理Fragment碎片相关方法,以及提供了一些初始化的对外方法,这里面不涉及业务,不涉及UI。下一章中我将继承BaseFragmentActivity,实现公共UI和公共业务。

上一篇:从头开始搭建你的Android项目(1)- gradle优化

下一篇:从头开始搭建你的Android项目(3)- 实现公共的Toolbar

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值