让你的Dialog变得更简洁一点吧

2018-08-07 15:41:49 浏览数 (1)

用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}

用法不变。

0 人点赞