我理解的BaseActivityBaseFragment应该这么
2018-06-20 本文已影响116人
卖臭豆腐的王致和
转载请注明原创出处,谢谢!
- GitHub: @Ricco
我的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 钩子方法
}
}