banner
NEWS LETTER

Builder模式创建万能NavigationBar

Scroll down

创建INavigationBar接口

1
2
3
4
5
6
7
8
9
10
11
12
13
public interface INavigationBar {
/**
* 绑定布局
*
* @return i
*/
int bindLayoutId();

/**
* 绑定view
*/
void applyView();
}

创建AbsNavigationBar基类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
public abstract class AbsNavigationBar<P extends AbsNavigationBar.Builder.AbsNavigationParams> implements INavigationBar {
private final P mParams;
private View mNavigationView;

public AbsNavigationBar(P params) {
this.mParams = params;
createAndBindView();
}

public P getParams() {
return mParams;
}

/**
* 设置文字
*
* @param viewId i
* @param text t
*/
protected void setText(int viewId, String text) {
TextView textView = findViewById(viewId);
if (!TextUtils.isEmpty(text)) {
textView.setVisibility(View.VISIBLE);
textView.setText(text);
}
}

/**
* 设置图标
*
* @param viewId i
* @param resId i
*/
protected void setIcon(int viewId, int resId) {
ImageView imageView = findViewById(viewId);
if (resId != 0) {
imageView.setVisibility(View.VISIBLE);
imageView.setImageResource(resId);
}
}

/**
* 设置点击事件
*
* @param viewId i
* @param listener l
*/
protected void setOnclickListener(int viewId, View.OnClickListener listener) {
findViewById(viewId).setOnClickListener(listener);
}

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

/**
* 绑定和创建view
*/
private void createAndBindView() {
//创建view
if (mParams.mParent == null) {
//获取activity的根布局
ViewGroup activityRoot = (ViewGroup) ((Activity) (mParams.mContext)).getWindow().getDecorView();
mParams.mParent = (ViewGroup) activityRoot.getChildAt(0);
}
if (mParams.mParent == null) {
return;
}
mNavigationView = LayoutInflater.from(mParams.mContext)
.inflate(bindLayoutId(), mParams.mParent, false);
//添加
mParams.mParent.addView(mNavigationView, 0);
applyView();
}

@Override
public int bindLayoutId() {
return 0;
}

@Override
public void applyView() {
}

public abstract static class Builder {
/**
* 创建方法
*
* @return b
*/
public abstract AbsNavigationBar build();

public Builder(Context context, ViewGroup parent) {
}

public static class AbsNavigationParams {
public Context mContext;
public ViewGroup mParent;

public AbsNavigationParams(Context context, ViewGroup parent) {
this.mContext = context;
this.mParent = parent;
}
}
}
}

创建默认的DefaultNavigationBar

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
public class DefaultNavigationBar extends AbsNavigationBar<DefaultNavigationBar.Builder.DefaultNavigationParams> {
public DefaultNavigationBar(DefaultNavigationBar.Builder.DefaultNavigationParams params) {
super(params);
}

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

@Override
public void applyView() {
//绑定效果
setText(R.id.title, getParams().mTitle);
setText(R.id.right_text, getParams().mRightText);
setIcon(R.id.left_icon, getParams().mLeftIcon);
setIcon(R.id.right_icon, getParams().mRightIcon);
setOnclickListener(R.id.right_text, getParams().mRightClickListener);
setOnclickListener(R.id.left_text, 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 build() {
return new DefaultNavigationBar(P);
}

//设置所有效果
public DefaultNavigationBar.Builder setTitle(String title) {
P.mTitle = title;
return this;
}

public DefaultNavigationBar.Builder setRightText(String rightText) {
P.mRightText = rightText;
return this;
}

public DefaultNavigationBar.Builder setRightIcon(int rightIcon) {
P.mRightIcon = rightIcon;
return this;
}

public DefaultNavigationBar.Builder setLeftText(String leftText) {
P.mLeftText = leftText;
return this;
}

public DefaultNavigationBar.Builder setLeftIcon(int leftIcon) {
P.mLeftIcon = leftIcon;
return this;
}

public DefaultNavigationBar.Builder setRightClickListener(View.OnClickListener listener) {
P.mRightClickListener = listener;
return this;
}

public DefaultNavigationBar.Builder setLeftClickListener(View.OnClickListener listener) {
P.mLeftClickListener = listener;
return this;
}

public static class DefaultNavigationParams extends
AbsNavigationBar.Builder.AbsNavigationParams {
//放置所有的效果
public String mTitle;
public String mRightText;
public String mLeftText;
public int mRightIcon;
public int mLeftIcon;

public View.OnClickListener mRightClickListener;
public View.OnClickListener mLeftClickListener = view -> {
((Activity) mContext).finish();
};

public DefaultNavigationParams(Context context, ViewGroup parent) {
super(context, parent);
}
}
}
}

使用方法

1
2
3
4
5
6
7
new DefaultNavigationBar.Builder(this)
.setTitle("标题")
.setRightText("发布")
.setLeftText("返回")
.setLeftIcon(R.mipmap.ic_launcher)
.setRightClickListener(v -> showToast("发布"))
.build();
其他文章
目录导航 置顶
  1. 1. 创建INavigationBar接口
  2. 2. 创建AbsNavigationBar基类
  3. 3. 创建默认的DefaultNavigationBar
  4. 4. 使用方法
请输入关键词进行搜索