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