自定义ActionBar,在BaseActivity如何降低耦合
2016-08-18 10:06
253 查看
在工作中,ActionBar使用非常频繁,虽然系统的ActionBar、ToolBar给我们提供了很棒的UI体验。但是,我们平常的项目中并不需要这么酷炫的ActionBar。通常来说,一个ActionBar包括
左边图片, 左边文字, 标题 ,右边文字,右边图标。
以上5点,基本满足了80%的ActionBar需求。
一般我们将实现的过程写在BaseActivity中,但有几个不方便的点:
1、子类中不方便修改,除非声明全局变量,但这会给代码带来严重的碎片化,致使不好管理;
2、如果不声明全局变量,则需要重新findViewById一次,才能对ActionBar重新操作,使得代码可读性、维护性太差;
那有什么办法可以兼容这两种情况呢?
有,那就是,声明一个整体的全局变量:ActionViewHolder。
ActionHolder代码:
BaseActivity代码:
左边图片, 左边文字, 标题 ,右边文字,右边图标。
以上5点,基本满足了80%的ActionBar需求。
一般我们将实现的过程写在BaseActivity中,但有几个不方便的点:
1、子类中不方便修改,除非声明全局变量,但这会给代码带来严重的碎片化,致使不好管理;
2、如果不声明全局变量,则需要重新findViewById一次,才能对ActionBar重新操作,使得代码可读性、维护性太差;
那有什么办法可以兼容这两种情况呢?
有,那就是,声明一个整体的全局变量:ActionViewHolder。
ActionHolder代码:
/** * Created by yanjunhui * on 2016/8/17. * email:303767416@qq.com */ public class ActionHolder { View layLeft; View layRight; public TextView tvTitle; public TextView tvLeft; public TextView tvRight; public View iconLeft; public View iconRight; }
BaseActivity代码:
/** * Created by yanjunhui * on 2016/8/15. * email:303767416@qq.com */ public abstract class BaseActivity extends AppCompatActivity { private ActionHolder actionHolder; @Override public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) { super.onCreate(savedInstanceState, persistentState); MyApplication.getInstance().addActivity(this); } @Override protected void onDestroy() { super.onDestroy(); } /** * 构建自己的ActionBar */ protected void buildActionBar(String strTitle, int resIdLeft, String strLeft, int resIdRight, String strRight, final ActionBarClickListener listener) { actionHolder = new ActionHolder(); actionHolder.tvTitle = (TextView) findViewById(R.id.tv_actionbar_title); actionHolder.tvLeft = (TextView) findViewById(R.id.tv_actionbar_left); actionHolder.tvRight = (TextView) findViewById(R.id.tv_actionbar_right); actionHolder.iconLeft = findViewById(R.id.v_actionbar_left); actionHolder.iconRight = findViewById(R.id.v_actionbar_right); if (!TextUtils.isEmpty(strTitle)) { actionHolder.tvTitle.setText(strTitle); } if (!TextUtils.isEmpty(strLeft)) { actionHolder.tvLeft.setText(strLeft); actionHolder.tvLeft.setVisibility(View.VISIBLE); } else { actionHolder.tvLeft.setVisibility(View.GONE); } if (!TextUtils.isEmpty(strRight)) { actionHolder.tvRight.setText(strRight); actionHolder.tvRight.setVisibility(View.VISIBLE); } else { actionHolder.tvRight.setVisibility(View.GONE); } if (resIdLeft == 0) { actionHolder.iconLeft.setVisibility(View.GONE); } else { actionHolder.iconLeft.setBackgroundResource(resIdLeft); actionHolder.iconLeft.setVisibility(View.VISIBLE); } if (resIdRight == 0) { actionHolder.iconRight.setVisibility(View.GONE); } else { actionHolder.iconRight.setBackgroundResource(resIdRight); actionHolder.iconRight.setVisibility(View.VISIBLE); } if (listener != null) { actionHolder.layLeft = findViewById(R.id.lay_actionbar_left); actionHolder.layRight = findViewById(R.id.lay_actionbar_right); actionHolder.layLeft.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { listener.onLeftClick(); } }); actionHolder.layRight.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { listener.onRightClick(); } }); } } /** * 获得自己的ActionBar * * @return */ public ActionHolder getActionHolder() { return actionHolder; }
相关文章推荐
- 发现一个免费邮件代发平台,sendpost.cn
- Android混淆——混淆代码总结
- aaaaaaaaaaaaaaa
- JS 学习(四)对象
- iOS - OC Category 分类
- atoi函数的实现
- 麻省理工告诉我们男女配对的真相
- 数组排序sort()
- OpenSceneGraph实现的NeHe OpenGL教程 - 第三十八课
- 分治法写划分数
- 使用聚合函数group by后面必须要带着所有要查询的列,但是我只想根据group by后面的第一个列进行分组,怎么办? [
- springMvc IE浏览器 前台中文参数 乱码问题解决方法
- 你知道C#中的Lambda表达式的演化过程吗
- C语言头文件的包含顺序
- 苹果剪切板,涨姿势了UIPasteboard
- View绘制流程资料
- CoordinatorLayout高级用法-自定义Behavior
- OpenSceneGraph实现的NeHe OpenGL教程 - 第三十九课
- 输入挂
- zzuli oj 1918 晴天寻宝