用Builder模式重新打造一个dialog,案例中有两种Builder,分别是CommonBuilder和MDBuilder,如果还想实现其他的通用,继承自FRBaseDialogBuilder即可。
1、下载
Gradle:
代码语言:javascript复制1repositories {
2 jcenter()
3}
4
5dependencies {
6 compile 'com.jack.frdialog:FRDialog:1.0.1'
7}
2、使用案例
2.1、普通Dialog
代码语言:javascript复制 1private void showCommonDialog() {
2 final FRDialog dialog = new FRDialog.CommonBuilder(this)
3 .setContentView(R.layout.dialog_common)
4 .setText(R.id.dcu_tv_cancel, "否")
5 .setText(R.id.dcu_tv_confirm, "是")
6 .setText(R.id.dcu_tv_title, "温馨提示")
7 .setText(R.id.dcu_tv_content, "1.文字文字我是文字文字文字我是文字文字文字我是文字!n2.文字文字文字文字文字n3.文字文字文字文字文字")
8 .setDefaultAnim()
9 .show();
10
11 dialog.setText(R.id.dcu_tv_confirm, "确定");
12
13 dialog.setOnClickListener(R.id.dcu_tv_cancel, new FRDialogClickListener() {
14 @Override
15 public boolean onDialogClick(View view) {
16 Toast.makeText(MainActivity.this, "点击了否", Toast.LENGTH_SHORT).show();
17 return true;
18 }
19 });
20
21 dialog.setOnClickListener(R.id.dcu_tv_confirm, new FRDialogClickListener() {
22 @Override
23 public boolean onDialogClick(View v) {
24 Toast.makeText(MainActivity.this, "点击了是", Toast.LENGTH_SHORT).show();
25 return false;
26 }
27 });
28}
普通dialog
2.2、MaterialDesign Dialog
代码语言:javascript复制 1private void showMDDialog() {
2 FRDialog dialog = new FRDialog.MDBuilder(this)
3 .setMessage("1.文字文字我是文字文字!n2.文字文字文字文字文字n3.文字文字文字文字文字")
4 .setTitle("温馨提示")
5 .setNegativeContentAndListener("否", null)
6 .setNegativeTextColor(ContextCompat.getColor(this,R.color.c999999))
7 .setPositiveTextColor(ContextCompat.getColor(this,R.color.colorPrimary))
8 .setPositiveContentAndListener("是", new FRDialogClickListener() {
9 @Override
10 public boolean onDialogClick(View view) {
11 return true;
12 }
13 }).show();
14}
MD效果的dialog
从底部弹出的dialog
3、特殊设置:
继承所有dialog的设置,同时还可以自定义以下设置
代码语言:javascript复制1//设置宽度全屏
2dialog.setFullWidth()
3
4//设置从底部弹出
5dialog.setFromBottom()
6
7//设置弹出动画
8dialog.setAnimation(int anim)
2018.5.24日更新
将mWidth改成mWidthOffset,不让用户设置一个具体的宽度,而是让用户去设置一个宽度比例,然后通过改变window的LayoutParams来设置dialog的宽高:
代码语言:javascript复制1WindowManager.LayoutParams lp = window.getAttributes();
2lp.width = (int) (baseBuilder.mContext.getResources().getDisplayMetrics().widthPixels * baseBuilder.mWidthOffset);
3lp.height = baseBuilder.mHeight;
4window.setAttributes(lp);
用法还是和之前一样:
代码语言:javascript复制1dialog.setWidthOffset(0——1) 默认是0.9
2018.7.19日更新
新增点击dialog中非EditText区域隐藏软键盘
代码语言:javascript复制 1重写dispatchTouchEvent方法进行拦截:
2
3/**
4 * 点击dialog中除EditText以外的区域隐藏软键盘
5 *
6 * @param ev
7 * @return
8 */
9@Override
10public boolean dispatchTouchEvent(@NonNull MotionEvent ev) {
11 FRInputMethodManager.autoHideSoftInput(this, ev);
12 return super.dispatchTouchEvent(ev);
13}
14
15//核心方法
16public static boolean isAutoHideSoftInput(View view, MotionEvent event) {
17 if (event.getAction() != MotionEvent.ACTION_DOWN) {
18 return false;
19 }
20
21 if (!(view instanceof EditText)) {
22 return false;
23 }
24
25 float x = event.getX();
26 float y = event.getY();
27
28 int[] location = {0, 0};
29 view.getLocationInWindow(location);
30 int left = location[0];
31 int top = location[1];
32 int bottom = top view.getHeight();
33 int right = left view.getWidth();
34 if (left <= x && x < right && top <= y && y < bottom) {
35 // 点击事件在EditText的区域里
36 return false;
37 }
38
39 return true;
40}
用法不变。