最近公司项目调接口,业务比较忙没有时间写东西了,今天新给了一个需求要求在没一个activity中都要有一个floatingactionButton。我就改了之前写的BaseActivity,下面基本说一下我的思路。
1,如何在baseActivity中固定一个控件呢?
因为我们的控件必须依赖于一个继承自viewGroup的布局存在。所以一开始我的想法是在BaseAcitivity中获取到子activity的布局,然后new出控件加进去,但是事实正面这样是行不同的。
/**
* 创建fab
*/
private void setFabm(ViewGroup viewGroup) {
final FloatingActionButton programFab1 = new FloatingActionButton(mContext);
programFab1.setButtonSize(FloatingActionButton.SIZE_MINI);
programFab1.setLabelText("fab");
programFab1.setImageResource(R.mipmap.ic_edit);
contentview.addView(programFab1)
programFab1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
programFab1.setLabelColors(ContextCompat.getColor(mContext, R.color.grey),
ContextCompat.getColor(mContext, R.color.light_grey),
ContextCompat.getColor(mContext, R.color.white_transparent));
programFab1.setLabelTextColor(ContextCompat.getColor(mContext, R.color.black));
}
});
}
会在addview的时候报空指针,是因为contentview没有获取到。
真正正确的做法:
新建一个baseActivity的布局加入需要固定的控件,重写setcontentView
@Override
public void setContentView(@LayoutRes int layoutResID) {
if ( R.layout.base == layoutResID) {
super.setContentView(R.layout.base);
contentView = (LinearLayout) findViewById(R.id.layout_center);
contentView.removeAllViews();
} else if (layoutResID != R.layout.base) {
View addView = LayoutInflater.from(this).inflate(layoutResID, null);
contentView.addView(addView);
}
}
当传过来的布局文件是我们的base的时候,我们才去实际的设置布局文件
super.setContentView(R.layout.activity_base);,同时获取里面的一个容器ContentView,在我们的子类调用这个方法的时候,我们就通过LayoutInflater去找到这个view,然后加到我们的base里面去,通过这种方式,我们拐弯的达到了继承BaseLayout的效果。
之后我们就可以把一些基础的各种设置ActionBar的工作从各个Activity里面抽出来,放到这个BaseActivity里面去。
ok 大功告成!!!