builder设计模式之NavigationBar

这里写图片描述

INavigation接口

public interface INavigation {
    /**
     * 设置布局
     */
    void createNavigationBar();

    /**
     * 添加到头部
     */
    void attachParent(View navigationBar, ViewGroup parent);

    /**
     * 添加参数
     */
    void attachNavigationParams();
}

基本的NavigationBar

public class AbsNavigationBar<T extends AbsNavigationBar.Builder> implements INavigation {
    private T mBuilder;
    private View mNavigationBar;

    protected AbsNavigationBar(T builder) {
        this.mBuilder = builder;
        createNavigationBar();
    }

    public T getBuilder() {
        return (T) mBuilder;
    }

    @Override
    public void createNavigationBar() {
        //设置布局
        mNavigationBar = LayoutInflater.from(mBuilder.mContext)
                .inflate(mBuilder.mLayoutId, mBuilder.mParent, false);
        //添加
        attachParent(mNavigationBar, mBuilder.mParent);
        // 绑定参数
        attachNavigationParams();
    }

    @Override
    public void attachParent(View navigationBar, ViewGroup parent) {
        parent.addView(navigationBar, 0);
    }

    //放置参数
    @Override
    public void attachNavigationParams() {
        //设置文本
        HashMap<Integer, CharSequence> textMaps = mBuilder.mTextMaps;
        for (Map.Entry<Integer, CharSequence> entry : textMaps.entrySet()) {
            TextView textView = findViewById(entry.getKey());
            textView.setText(entry.getValue());
        }
        //设置点击事件
        HashMap<Integer, View.OnClickListener> clickListenerMaps = mBuilder.mClickListeners;
        for (Map.Entry<Integer, View.OnClickListener> entry : clickListenerMaps.entrySet()) {
            View view = findViewById(entry.getKey());
            view.setOnClickListener(entry.getValue());
        }
    }

    public  <T extends View> T findViewById(int viewId) {
        return mNavigationBar.findViewById(viewId);
    }

    public abstract static class Builder<T extends Builder> {
        public Context mContext;
        public int mLayoutId;
        public ViewGroup mParent;
        public HashMap<Integer, CharSequence> mTextMaps;
        public HashMap<Integer, View.OnClickListener> mClickListeners;

        public Builder(Context context, int layoutId, ViewGroup parent) {
            this.mContext = context;
            this.mLayoutId = layoutId;
            this.mParent = parent;
            mClickListeners = new HashMap<>();
            mTextMaps = new HashMap<>();
        }

        public abstract AbsNavigationBar create();

        public T setText(int viewId, String text) {
            mTextMaps.put(viewId, text);
            return (T) this;
        }

        public T setOnClickListener(int viewId, View.OnClickListener listener) {
            mClickListeners.put(viewId, listener);
            return (T) this;
        }
    }
}

默认的NaviationBar,默认知道了布局

public class DefaultNavigationBar extends AbsNavigationBar<DefaultNavigationBar.Builder>{
    protected DefaultNavigationBar(Builder builder) {
        super(builder);

    }

    @Override
    public void attachNavigationParams() {
        super.attachNavigationParams();
        TextView textView=findViewById(R.id.back_tv);
        textView.setVisibility(getBuilder().mLeftVisible);
    }

    public static class Builder extends AbsNavigationBar.Builder<DefaultNavigationBar.Builder>{
         private int mLeftVisible=View.VISIBLE;
        public Builder(Context context, ViewGroup parent) {
            super(context, R.layout.ui_default_navigation_bar, parent);
        }

        @Override
        public DefaultNavigationBar create() {
            return new DefaultNavigationBar(this);
        }
        public Builder setLeftText(String text){
            setText(R.id.back_tv,text);
            return this;
        }
        public Builder setLeftClickListener(View.OnClickListener listener){
            setOnClickListener(R.id.back_tv,listener);
            return this;
        }
        public Builder hideLeftText(){
            mLeftVisible=View.INVISIBLE;
            return this;
        }
    }
}

给客户用的NavigationBar

public class NavigationBar extends AbsNavigationBar{
    protected NavigationBar(Builder builder) {
        super(builder);
    }
    public static class Builder extends AbsNavigationBar.Builder<NavigationBar.Builder>{

        public Builder(Context context, int layoutId, ViewGroup parent) {
            super(context, layoutId, parent);
        }

        @Override
        public NavigationBar create() {
            return new NavigationBar(this);
        }
    }
}

最后的使用

   ViewGroup parent = (ViewGroup) findViewById(R.id.view_root);
        DefaultNavigationBar navigationBar = new DefaultNavigationBar
                .Builder(this,parent)
                .setLeftText( "返回")
                //.hideLeftText()
                .setLeftClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        finish();
                    }
                })
              .create();
        /*  NavigationBar navigationBar=new NavigationBar
                .Builder(this,R.layout.ui_navigation_bar,parent)
                .setText(R.id.back_tv,"返回")
                .setOnClickListener(R.id.back_tv, new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                     finish();
                    }
                }).create();*/
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值