Builder设计模式01:实现顶部NavigationBar

Builder设计模式,创建NavigationBar

header 的常用实现:
在布局layout中写;用系统的Toolbar;自定义的(View写在文件布局layout文件中)

----预览效果----
AlertDialog dialog = new AlertDialog.Builder(this)
        .setContentView(R.layout.detail_comment_dialog)
        .formBottom(true).fullWidth().show();

eg:

// 初始化头部
DefaultNavigationBar navigationBar = new DefaultNavigationBar.Builder(this)
    .setTitleText("标题")
    .setRightText("发布")
    .create();

一. 使用自定义默认NavigationBar

/**
 * Builder设计模式构建NavigationBar-(效果演示)
 */
public class NavHomeActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_nav_home);

        DefaultNavigationBar navigationBar = new DefaultNavigationBar
                // .Builder(this, findViewById(R.id.view_group))
                .Builder(this)
                .setTitle("今日标题")
                .setRightTitle("卧槽")
                .setRightClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(NavHomeActivity.this, "click show", Toast.LENGTH_SHORT).show();
                    }
                })
                .builder();
    }
}

二. 指定Navigation规范(接口)

/**
 * 导航栏的规范
 */
public interface INavigationBar {
    // 绑定布局id
    int bindLayoutId();
    // 绑定头部的数据
    void applyView();
}

三. NavigationBar 头部的Builder基类,抽象类

/**
 * NavigationBar 头部的Builder基类。
 * AbsNavigationBar, Builder, 参数Params.
 */
public abstract class AbsNavigationBar

implements INavigationBar { // 传进来的参数 private P mParams; private View mNavigationView; public AbsNavigationBar(P params) { this.mParams = params; createAndBindView(); } public P getParams() { return mParams; } protected void setText(int viewId, String text) { TextView tv = mNavigationView.findViewById(viewId); if (!TextUtils.isEmpty(text)) { tv.setVisibility(View.VISIBLE); tv.setText(text); } } protected void setOnClickListener(int viewId, View.OnClickListener clickListener) { mNavigationView.findViewById(viewId).setOnClickListener(clickListener); } // public T findViewById(int viewId) { // return (T) mNavigationView.findViewById(viewId); // } /** * 根据传进来的参数集合P,创建和绑定View */ private void createAndBindView() { // 未给Activity设置id(android:id="@+id/view_group") if (mParams.mParent == null) { // 获取Activity的根布局(是否是LinearLayout)。继承自AppCompatActivity。 ViewGroup activityRoot = ((Activity) mParams.mContext).findViewById(android.R.id.content); mParams.mParent = (ViewGroup) activityRoot.getChildAt(0); Log.d("0101", "" + mParams.mParent); } // TODO 处理继承自Activity,的View源码部分。 // ... if (mParams.mParent == null) return; // 1.创建View,bindLayoutId()调用子类实现的方法(抽象方法),获取到布局id。 mNavigationView = LayoutInflater.from(mParams.mContext) .inflate(bindLayoutId(), mParams.mParent, false); // 2. 头部navigationView,添加到第0个位置(根布局LinearLayout的第一个元素) mParams.mParent.addView(mNavigationView, 0); // 3. 绑定参数 applyView(); } // 内部抽象类。静态类里面还有静态类。 public abstract static class Builder { public Builder(Context context, ViewGroup parent) { } public abstract AbsNavigationBar builder(); public static class AbsNavigationParams { public Context mContext; public ViewGroup mParent; public AbsNavigationParams(Context context, ViewGroup parent) { this.mContext = context; this.mParent = parent; } } } }

四. NavigationBar默认实现类:DefaultNavigationBar

/**
 * Builder设计模式,打造NavigationBar头部。
 * 知识点:泛型 +Builder设计模式
 * 后续扩展:1.继承自AbsNavigationBar来实现新的类;
 * 2. 继承自DefaultNavigationBar,来实现功能。
 *      public public class DefaultNavigationBar ...
 */
public class DefaultNavigationBar extends
        AbsNavigationBar {

    public DefaultNavigationBar(DefaultNavigationBar.Builder.DefaultNavigationParams params) {
        // 接受参数P,并传给父类中
        super(params);
    }

    @Override
    public int bindLayoutId() {
        return R.layout.title_bar;
    }

    @Override
    public void applyView() {
        // 绑定UI效果。
        setText(R.id.title, getParams().mTitle);
        setText(R.id.right_title, getParams().mRightTitle);
        // 设置点击事件
        setOnClickListener(R.id.right_title, getParams().mRightClickListener);
        // 通用返回键处理。
        setOnClickListener(R.id.left_title, getParams().mLeftClickListener);
    }

    public static class Builder extends AbsNavigationBar.Builder {
        // 参数保存
        DefaultNavigationParams P;

        public Builder(Context context, ViewGroup parent) {
            super(context, parent);
            P = new DefaultNavigationParams(context, parent);
        }
        public Builder(Context context) {
            super(context, null);
            P = new DefaultNavigationParams(context, null);
        }

        @Override
        public DefaultNavigationBar builder() {
            // 传递P进去,
            DefaultNavigationBar bar = new DefaultNavigationBar(P);
            return bar;
        }

        // 1.设置所有效果。
        public DefaultNavigationBar.Builder setTitle(String title) {
            P.mTitle = title;
            return this;
        }
        public DefaultNavigationBar.Builder setRightTitle(String rightTitle) {
            P.mRightTitle = rightTitle;
            return this;
        }
        // 设置右边图标......
        public DefaultNavigationBar.Builder setRightIcon(int rightResId) {
            P.mRightIcon = rightResId;
            return this;
        }

        public DefaultNavigationBar.Builder setRightClickListener(View.OnClickListener rClickListener) {
            P.mRightClickListener = rClickListener;
            return this;
        }
        // 覆盖左边点击事件的方法。
        public DefaultNavigationBar.Builder setLeftClickListener(View.OnClickListener rClickListener) {
            P.mLeftClickListener = rClickListener;
            return this;
        }

        public static class DefaultNavigationParams extends
                AbsNavigationBar.Builder.AbsNavigationParams {
            // 2.存放所有的效果。
            public String mTitle; // 设置中间标题
            public String mRightTitle; // 设置右边按钮文本
            public int mRightIcon; // 设置右边按钮图片

            // 通用的
            public View.OnClickListener mRightClickListener; // 右边点击事件
            // 左边点击事件,有默认事件(关闭)。可以覆盖该方法。
            public View.OnClickListener mLeftClickListener = new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    ((Activity) mContext).finish();
                }
            };

            // 构造方法
            public DefaultNavigationParams(Context context, ViewGroup parent) {
                super(context, parent);
            }
        }
    }

}

五. 相关布局文件

// activity_nav_home.xml


    


// title_bar.xml




    
    

    
    



你可能感兴趣的:(Builder设计模式01:实现顶部NavigationBar)