我理解的BaseActivityBaseFragment应该这么写!

转载请注明原创出处,谢谢!

我的BaseActivity是有一个弊端的,因为用了反射的关系,所以在性能上会有一定的影响,但问题不是很大,可以忽略不计,当然,如果你对性能要求特别高,不建议使用。

为什么要这么写?

  • 不想每次都写setContentView(layoutId)方法,所以就用一个反射的方式,来减少每次写的代码。
  • 养成良好的编码习惯,布局命名规范。
  • 让自己的代码,具有自己的风格。
  • 是不是显得技术会很厉害???哈哈哈

为什么不像别人一样,把log,toast,intent什么的也写进去?

  • 这些东西应该有专门的Utils去管理,例如xUtils就不错,实在不想写,可以当Ctrl+C/V大神啊,而不是臃肿的放在BaseActivity中。
  • 竟可能的少些一些代码,会让别人看着舒服!

BaseActivity核心代码

用了这个BaseActivity,你只要将布局的xml命名为layout_abc,java命名为AbcActivity,它就会自动加载布局,而不需要每次setContentView了。(注意大小写)

public abstract class BaseActivity extends AppCompatActivity {
    @Override
    //  ***这里要用一个参数的onCreate,两个参数是不会显示页面内容的***这个坑我踩过!记一下。。
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 尝试调用setContentView(layoutId)方法
        // 尝试根据类名(例如:MainActivity)--->资源文件的名字(activity_main)
        String clazzName = this.getClass().getSimpleName();// MainAcitivity
        if (clazzName.contains("Activity")) {
            String activityName = clazzName.substring(0,
                    clazzName.indexOf("Activity")).toLowerCase(Locale.US);// main
            String resName = "activity_" + activityName;// activity_main
            // 根据resName找到其对应的resId(根据activity_main--->R.layout.activity_main)
            int resId = getResources().getIdentifier(resName, "layout",
                    getPackageName());
            if (resId != 0) {
                // 确实找到了资源ID(R.layout.activity_main)
                setContentView(resId);
            }
        }
        initView();
        initListener();
        MyApp.addActivity(this);// 将正在创建的活动添加到活动管理器里
    }

    protected abstract void initView();

    protected abstract void initListener();

    @Override
    protected void onDestroy() {
        super.onDestroy();
        MyApp.removeActivity(this);// 将一个要销毁的活动从活动管理器里移除
    }
}

同样BaseFragment也可以

public abstract class BaseFragment extends Fragment {
    protected View contentView = null;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        // SettingFragment;
        String clazzName = getClass().getSimpleName();
        if (clazzName.contains("Fragment")) {
            // "标准"的布局文件命名应该是:fragment_setting
            String layoutName = clazzName.substring(0,
                    clazzName.indexOf("Fragment")).toLowerCase(Locale.US);
            layoutName = "fragment_" + layoutName;
            // R.layout.fragment_setting
            int resId = getResources().getIdentifier(layoutName, "layout",
                    getActivity().getPackageName());

            if (resId != 0) {
                contentView = inflater.inflate(resId, container, false);// 利用反射,加载布局
            }
        }
        return contentView;
    }
    
    @Override
    public void onStart() {
        super.onStart();
        init();
    }
    
    public void init() {// 如果有特殊原因,反射没有成功,你可以在这里,二次加载
        // No-OP 钩子方法
    }
}

推荐阅读更多精彩内容