butterknife的base类抽取
在android开发中与xml之间交互式最常用不过的了,findviewById 可以获取字段进行数据绑定,DataBinging比较简便,对于我来说ButterKnife是习惯性的获取字段的依赖控件
但是在android中无论是activity还是fragment都频繁用到ButterKnife,为了避免代码块的重复需要在base基类中抽取ButterKnife,下面介绍在baseActivity中的抽取和子类实现和baseFragment中的抽取和子类的实现:
在activity中—>baseActivity:
public abstract class BaseActivity extends AppCompatActivity {
public Context mContext;//上下文对象
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = this;
supportRequestWindowFeature(Window.FEATURE_NO_TITLE);//无标题
//setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); //设置APP只能显示横屏
ActivityCollector.addActivity(this);
}
/**
* 设置布局文件 统一管理
*
* @param layoutResID
*/
public void setContentView(int layoutResID) {
super.setContentView(layoutResID);
ButterKnife.bind(this); // butterKnife 注入
initView();
initData();
initEvent();
}
/**
* 初始化View
*/
protected abstract void initView();
/**
* 初始化数据
*/
protected abstract void initData();
/**
* 初始化事件
*/
protected abstract void initEvent();
@Override
protected void onDestroy() {
super.onDestroy();
ActivityCollector.removeActivity(this);
}
}
之后MainACtivity继承自BaseActivity:
public class MainActivity extends BaseActivity implements View.OnClickListener {
@BindView(R.id.toolbar)
Toolbar mToolbar;
@BindView(R.id.fl_content)
FrameLayout mFlContent;
@BindView(R.id.bottom_btn)
LinearLayout mBottomBtn;
@BindView(R.id.activity_main)
LinearLayout mActivityMain;
private ArrayList<BaseFragment> fragmentList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/**
* 初始化View
*/
@Override
protected void initView() {
LogUtil.i(mToolbar.getWidth()+"");
/**准备fragment*/
prepared();
/**点击bottom事件*/
clickChange();
/**回显*/
changUi(0);
switchFragment(0);
}
/**
* 初始化数据
*/
@Override
protected void initData() {
}
/**
* 初始化事件
*/
@Override
protected void initEvent() {
}
private void clickChange() {
int childCount = mBottomBtn.getChildCount();
for (int i = 0; i < childCount; i++) {
mBottomBtn.getChildAt(i).setOnClickListener(this);
}
}
@Override
public void onClick(View v) {
int position = mBottomBtn.indexOfChild(v);
/**颜色enable*/
changUi(position);
/**切换fragment*/
switchFragment(position);
}
private void changUi(int position) {
int childCount = mBottomBtn.getChildCount();
for (int i = 0; i < childCount; i++) {
View childAt = mBottomBtn.getChildAt(i);
if (position == i) {
setEnable(childAt, false);
} else {
setEnable(childAt, true);
}
}
}
public void setEnable(View view, boolean isEnable) {
view.setEnabled(isEnable);
if (view instanceof ViewGroup) {
int childCount = ((ViewGroup) view).getChildCount();
for (int i = 0; i < childCount; i++) {
View childAt = ((ViewGroup) view).getChildAt(i);
setEnable(childAt, isEnable);
}
}
}
private void switchFragment(int position) {
FragmentManager sf = getSupportFragmentManager();
FragmentTransaction transaction = sf.beginTransaction();
for (int i = 0; i < fragmentList.size(); i++) {
BaseFragment baseFragment = fragmentList.get(i);
if (position == i) {
if (baseFragment.isAdded()) {
transaction.show(baseFragment);
} else {
transaction.add(R.id.fl_content, baseFragment);
transaction.show(baseFragment);
}
} else {
if (baseFragment.isAdded()) {
transaction.hide(baseFragment);
} else {
transaction.add(R.id.fl_content, baseFragment);
transaction.hide(baseFragment);
}
}
}
transaction.commitAllowingStateLoss();
}
private void prepared() {
/**创建一个list来存储fragment*/
fragmentList = new ArrayList<>();
BaseFragment findFragment = new FindFragment();
BaseFragment licenseFragment = new LicenseFragment();
BaseFragment mineFragment = new MineFragment();
fragmentList.add(findFragment);
fragmentList.add(licenseFragment);
fragmentList.add(mineFragment);
}
/*@OnClick({R.id.search, R.id.msg,R.id.sel_city})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.search:
startActivity(new Intent(this,SearchActivity.class));
break;
case R.id.msg:
break;
case R.id.sel_city:
break;
}
}*/
}
在Fragment中—->BaseFragment:
public abstract class BaseFragment extends Fragment {
protected Activity mActivity;
public Unbinder unbinder;
private View mRootView;
@Override
public void onAttach(Context context) {
super.onAttach(context);
this.mActivity=(Activity) context;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if (getLayoutResId()!= 0){
mRootView = inflater.inflate(getLayoutResId(), container, false);
unbinder = ButterKnife.bind(this, mRootView);
initView(savedInstanceState);
}else{
mRootView = initView(savedInstanceState);
}
return mRootView;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
initData();
initEvent();
}
/**
* 初始化View
*/
public abstract int getLayoutResId();
protected abstract View initView(Bundle savedInstanceState);
/**
* 初始化数据
*/
protected void initData() {
}
/**
* 初始化事件
*/
protected void initEvent() {
}
@Override
public void onDestroy() {
super.onDestroy();
unbinder.unbind();
}
}
子fragment继承自BaseFragment:
public class LicenseFragment extends BaseFragment {
@BindView(R.id.tablayout)
TabLayout tablayout;
@BindView(R.id.viewpager)
ViewPager viewpager;
@Override
protected View initView(Bundle savedInstanceState) {
View view = View.inflate(mActivity,R.layout.fragment_license, null);
tablayout.setupWithViewPager(viewpager);
viewpager.setAdapter(new LicenseAdapter(getChildFragmentManager(),mActivity));
return view;
}
@Override
public int getLayoutResId() {
return R.layout.fragment_license;
}
}
如此就完成了butterKnife的简单抽取,是不是感觉很便捷,其实在android中为了提高代码质量,必须的抽取可以杜绝重复代码复用,提高项目性能.