刘正的技术博客

胆小认生,不易相处

擅长Android技能,深入研究移动端开发,此为博客一枚。


自定义ActionBar

前言:

相信大家都用过ActionBar吧,基本上都会去继承AppCompactActivity,但是在某些情况下,想实现一些特殊的效果的时候,系统自带的ActionBar就显得有点儿鸡肋了,不过后面又出了ToolBar控件,大大的弥补了ActionBar的不足,所以本次的自定义ActionBar就是继承的ToolBar,从而实现了ActionBar的高度以及可显示内容的高度定制。

下面列举几种自定义的样式:

1、自定义左侧返回菜单,使用方法见代码:


private MyActionBar actionBar;
actionBar = (MyActionBar) findViewById(R.id.myactionbar);
actionBar.withTitle(“分类目录”) //设置title文字
.setABCallBack(this) // 设置左侧返回按钮,中间自定义菜单及右侧按钮点击事件
.isShowBack(false) //是否显示左侧返回菜单
//效果见下图:

2、自定义ActionBar中间的view

private MyActionBar actionBar;
 actionBar = (MyActionBar) findViewById(R.id.myactionbar);
 //自定义中间的view。
 View view = getLayoutInflater().inflate(R.layout.actionbar_center, null);
        view.findViewById(R.id.btn_click).setOnClickListener(v -> Toast.makeText(getApplicationContext(), "id:" + ((Button) v.findViewById(R.id.btn_click)).getText(), Toast.LENGTH_SHORT).show());
actionBar.setABCallBack(this) // 设置左侧返回按钮,中间自定义菜单及右侧按钮点击事件
          .isShowBack(false) //是否显示左侧返回菜单
          .addCenterView(view); //添加自定义view 见图二TEST按钮
//效果见下图:

3、自定义右侧按钮点击事件

private MyActionBar actionBar;
 actionBar = (MyActionBar) findViewById(R.id.myactionbar);
 //右侧item adapter
 List menuEntities = new ArrayList<>();
        menuEntities.add(new MyPopupWindow.MenuEntity(R.drawable.titlebar_back_press, "name"));
        menuEntities.add(new MyPopupWindow.MenuEntity(R.drawable.titlebar_back_press, "name1"));
        menuEntities.add(new MyPopupWindow.MenuEntity(R.drawable.titlebar_back_press, "name2"));

actionBar.setABCallBack(this) // 设置左侧返回按钮,中间自定义菜单及右侧按钮点击事件
          .isShowBack(false) //是否显示左侧返回菜单
          .addMenuList(menuEntities) // 添加右侧按钮item
          .addCenterView(view); //添加自定义view 
//效果见下图:
 

MyActionBar 源码:

public class MyActionBar extends Toolbar {

    private int backColor;
    private int defaultColor;
    private TextView tvTitle;
    private ImageView ivBack, ivRight;
    private RelativeLayout llBackground;
    private AbCallBack abCallBack;
    private Context mContext;
    private LinearLayout llcontainer;
    private MyPopupWindow popupWindow;

    public MyActionBar(Context context) {
        super(context, null);

    }

    public MyActionBar(Context context, final AttributeSet attrs) {
        this(context, attrs, -1);
    }

    @TargetApi(Build.VERSION_CODES.M)
    public MyActionBar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.mContext = context;
        defaultColor = context.getColor(R.color.colorPrimary);
        LayoutInflater.from(context).inflate(R.layout.actionbar, this, true);
        TypedArray typedArray = context.obtainStyledAttributes(attrs,
                R.styleable.MyActionBar, 0, 0);
        backColor = typedArray.getColor(R.styleable.MyActionBar_myactionbar_background, defaultColor);
        llBackground = (RelativeLayout) findViewById(R.id.ll_background);
        llBackground.setBackgroundColor(backColor);
        llcontainer = (LinearLayout) findViewById(R.id.ll_container);
        tvTitle = (TextView) findViewById(R.id.tv_title);
        ivBack = (ImageView) findViewById(R.id.iv_back);
        ivRight = (ImageView) findViewById(R.id.iv_right);
        ivBack.setColorFilter(getResources().getColor(R.color.white));
        ivBack.setOnClickListener(v -> abCallBack.onBackClick());
        ivRight.setColorFilter(getResources().getColor(R.color.white));
        ivRight.setOnClickListener(v -> popupWindow.show(this));
    }

    public MyActionBar addCenterView(View view) {
        if (llcontainer != null) {
            llcontainer.removeAllViews();
            llcontainer.addView(view);
        }
        return this;
    }

    public MyActionBar addCenterViewClickListener(View view) {
        abCallBack.onCenterViewClick(view);
        return this;
    }

    public MyActionBar setHomeIcon(int resId) {
        if (mContext != null) {
            Picasso.with(mContext)
                    .load(resId)
                    .error(R.drawable.titlebar_back_press)
                    .into(ivBack);
        }
        return this;
    }


    public MyActionBar isShowBack(boolean isShow) {
        if (!isShow) {
            ivBack.setVisibility(INVISIBLE);
        } else {
            ivBack.setVisibility(VISIBLE);
        }
        return this;
    }

    public MyActionBar addMenuList(List menuEntityList) {
        popupWindow = new MyPopupWindow(mContext);
        popupWindow.addMenuList(menuEntityList)
                .addOnItemClickLisenter((parent, view, position, id) -> {
                    abCallBack.onRightClick(position);
                    popupWindow.dismiss();
                }).build();

        return this;
    }

    public MyActionBar setABCallBack(AbCallBack abCallBack) {
        this.abCallBack = abCallBack;
        return this;
    }

    public MyActionBar withTitle(String title) {
        tvTitle.setText(title);
        return this;
    }


}
 

AbCallBack (ActionBar点击事件回调)源码:

public interface AbCallBack {
    void onBackClick();
    void onRightClick();
}

更多使用方法详见github:

github : https://github.com/momentslz/openobj

更多内容请添加本人公众号: