From 0bbd53f2f02236360cfe53ac795bf187efeec748 Mon Sep 17 00:00:00 2001 From: cgspine Date: Fri, 25 Oct 2019 16:33:40 +0800 Subject: [PATCH] QMUITipDialog --- .../qmui/skin/QMUISkinValueBuilder.java | 4 + .../qmui/widget/dialog/QMUITipDialog.java | 158 ++++++++++++------ .../qmui/widget/dialog/QMUITipDialogView.java | 78 +++++++++ qmui/src/main/res/drawable/qmui_dialog_bg.xml | 21 --- .../main/res/drawable/qmui_tip_dialog_bg.xml | 22 --- .../res/layout/qmui_tip_dialog_layout.xml | 26 --- qmui/src/main/res/values/qmui_attrs_base.xml | 29 +++- qmui/src/main/res/values/qmui_style.xml | 58 ------- .../src/main/res/values/qmui_style_widget.xml | 22 ++- qmui/src/main/res/values/qmui_themes.xml | 38 ++++- .../components/QDTipDialogFragment.java | 6 - qmuidemo/src/main/res/values/theme.xml | 1 + 12 files changed, 266 insertions(+), 197 deletions(-) create mode 100644 qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUITipDialogView.java delete mode 100644 qmui/src/main/res/drawable/qmui_dialog_bg.xml delete mode 100644 qmui/src/main/res/drawable/qmui_tip_dialog_bg.xml delete mode 100644 qmui/src/main/res/layout/qmui_tip_dialog_layout.xml delete mode 100644 qmui/src/main/res/values/qmui_style.xml diff --git a/qmui/src/main/java/com/qmuiteam/qmui/skin/QMUISkinValueBuilder.java b/qmui/src/main/java/com/qmuiteam/qmui/skin/QMUISkinValueBuilder.java index b0a47b22..1d7bdcbb 100644 --- a/qmui/src/main/java/com/qmuiteam/qmui/skin/QMUISkinValueBuilder.java +++ b/qmui/src/main/java/com/qmuiteam/qmui/skin/QMUISkinValueBuilder.java @@ -308,4 +308,8 @@ public class QMUISkinValueBuilder { } return builder.toString(); } + + public void release(){ + QMUISkinValueBuilder.release(this); + } } diff --git a/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUITipDialog.java b/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUITipDialog.java index 776cecac..c2de9274 100644 --- a/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUITipDialog.java +++ b/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUITipDialog.java @@ -19,9 +19,12 @@ package com.qmuiteam.qmui.widget.dialog; import android.app.Dialog; import android.content.Context; import android.graphics.Color; +import android.graphics.drawable.Drawable; import android.os.Bundle; import androidx.annotation.IntDef; import androidx.annotation.LayoutRes; +import androidx.appcompat.widget.AppCompatImageView; +import androidx.constraintlayout.widget.ConstraintLayout; import androidx.core.content.ContextCompat; import android.text.TextUtils; import android.util.TypedValue; @@ -35,8 +38,13 @@ import android.widget.LinearLayout; import android.widget.TextView; import com.qmuiteam.qmui.R; +import com.qmuiteam.qmui.skin.QMUISkinHelper; +import com.qmuiteam.qmui.skin.QMUISkinManager; +import com.qmuiteam.qmui.skin.QMUISkinValueBuilder; import com.qmuiteam.qmui.util.QMUIDisplayHelper; +import com.qmuiteam.qmui.util.QMUIResHelper; import com.qmuiteam.qmui.widget.QMUILoadingView; +import com.qmuiteam.qmui.widget.textview.QMUISpanTouchFixTextView; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -54,6 +62,8 @@ import java.lang.annotation.RetentionPolicy; public class QMUITipDialog extends Dialog { + private boolean mFollowSkin = false; + public QMUITipDialog(Context context) { this(context, R.style.QMUI_TipDialog); } @@ -63,21 +73,29 @@ public class QMUITipDialog extends Dialog { setCanceledOnTouchOutside(false); } + public void setFollowSkin(boolean followSkin) { + mFollowSkin = followSkin; + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - initDialogWidth(); } - private void initDialogWidth() { - Window window = getWindow(); - if (window != null) { - WindowManager.LayoutParams wmLp = window.getAttributes(); - wmLp.width = ViewGroup.LayoutParams.MATCH_PARENT; - window.setAttributes(wmLp); + @Override + protected void onStart() { + super.onStart(); + if (mFollowSkin) { + QMUISkinManager.defaultInstance(getContext()).register(this); } } + @Override + protected void onStop() { + super.onStop(); + QMUISkinManager.defaultInstance(getContext()).unRegister(this); + } + /** * 生成默认的 {@link QMUITipDialog} *

@@ -119,6 +137,8 @@ public class QMUITipDialog extends Dialog { private CharSequence mTipWord; + private boolean mFollowSkin = true; + public Builder(Context context) { mContext = context; } @@ -141,96 +161,140 @@ public class QMUITipDialog extends Dialog { return this; } + public Builder setFollowSkin(boolean followSkin) { + mFollowSkin = followSkin; + return this; + } + public QMUITipDialog create(){ return create(true); } + public QMUITipDialog create(boolean cancelable) { + return create(cancelable, R.style.QMUI_TipDialog); + } + /** * 创建 Dialog, 但没有弹出来, 如果要弹出来, 请调用返回值的 {@link Dialog#show()} 方法 * * @param cancelable 按系统返回键是否可以取消 * @return 创建的 Dialog */ - public QMUITipDialog create(boolean cancelable) { - QMUITipDialog dialog = new QMUITipDialog(mContext); + public QMUITipDialog create(boolean cancelable, int style) { + QMUITipDialog dialog = new QMUITipDialog(mContext, style); dialog.setCancelable(cancelable); - dialog.setContentView(R.layout.qmui_tip_dialog_layout); - ViewGroup contentWrap = (ViewGroup) dialog.findViewById(R.id.contentWrap); + dialog.setFollowSkin(mFollowSkin); + Context dialogContext = dialog.getContext(); + QMUITipDialogView dialogView = new QMUITipDialogView(dialogContext); + QMUISkinValueBuilder builder = QMUISkinValueBuilder.acquire(); if (mCurrentIconType == ICON_TYPE_LOADING) { - QMUILoadingView loadingView = new QMUILoadingView(mContext); - loadingView.setColor(Color.WHITE); - loadingView.setSize(QMUIDisplayHelper.dp2px(mContext, 32)); - LinearLayout.LayoutParams loadingViewLP = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); - loadingView.setLayoutParams(loadingViewLP); - contentWrap.addView(loadingView); + QMUILoadingView loadingView = new QMUILoadingView(dialogContext); + loadingView.setColor(QMUIResHelper.getAttrColor( + dialogContext, R.attr.qmui_skin_support_tip_dialog_loading_color)); - } else if (mCurrentIconType == ICON_TYPE_SUCCESS || mCurrentIconType == ICON_TYPE_FAIL || mCurrentIconType == ICON_TYPE_INFO) { - ImageView imageView = new ImageView(mContext); - LinearLayout.LayoutParams imageViewLP = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); - imageView.setLayoutParams(imageViewLP); + loadingView.setSize(QMUIResHelper.getAttrDimen( + dialogContext, R.attr.qmui_tip_dialog_loading_size)); + builder.tintColor(QMUIResHelper.getAttrString( + dialogContext, R.attr.qmui_skin_def_tip_dialog_loading_color)); + QMUISkinHelper.setSkinValue(loadingView, builder); + dialogView.addView(loadingView, onCreateIconOrLoadingLayoutParams(dialogContext)); + } else if (mCurrentIconType == ICON_TYPE_SUCCESS || + mCurrentIconType == ICON_TYPE_FAIL || + mCurrentIconType == ICON_TYPE_INFO) { + ImageView imageView = new AppCompatImageView(mContext); + + builder.clear(); + Drawable drawable; if (mCurrentIconType == ICON_TYPE_SUCCESS) { - imageView.setImageDrawable(ContextCompat.getDrawable(mContext, R.drawable.qmui_icon_notify_done)); + drawable = QMUIResHelper.getAttrDrawable( + dialogContext, R.attr.qmui_skin_support_tip_dialog_icon_success_src); + builder.src(QMUIResHelper.getAttrString( + dialogContext, R.attr.qmui_skin_def_tip_dialog_icon_success_src)); } else if (mCurrentIconType == ICON_TYPE_FAIL) { - imageView.setImageDrawable(ContextCompat.getDrawable(mContext, R.drawable.qmui_icon_notify_error)); + drawable = QMUIResHelper.getAttrDrawable( + dialogContext, R.attr.qmui_skin_support_tip_dialog_icon_error_src); + builder.src(QMUIResHelper.getAttrString( + dialogContext, R.attr.qmui_skin_def_tip_dialog_icon_error_src)); } else { - imageView.setImageDrawable(ContextCompat.getDrawable(mContext, R.drawable.qmui_icon_notify_info)); + drawable = QMUIResHelper.getAttrDrawable( + dialogContext, R.attr.qmui_skin_support_tip_dialog_icon_info_src); + builder.src(QMUIResHelper.getAttrString( + dialogContext, R.attr.qmui_skin_def_tip_dialog_icon_info_src)); } - - contentWrap.addView(imageView); + imageView.setImageDrawable(drawable); + QMUISkinHelper.setSkinValue(imageView, builder); + dialogView.addView(imageView, onCreateIconOrLoadingLayoutParams(dialogContext)); } if (mTipWord != null && mTipWord.length() > 0) { - TextView tipView = new TextView(mContext); - LinearLayout.LayoutParams tipViewLP = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); - - if (mCurrentIconType != ICON_TYPE_NOTHING) { - tipViewLP.topMargin = QMUIDisplayHelper.dp2px(mContext, 12); - } - tipView.setLayoutParams(tipViewLP); - + TextView tipView = new QMUISpanTouchFixTextView(mContext); tipView.setEllipsize(TextUtils.TruncateAt.END); tipView.setGravity(Gravity.CENTER); - tipView.setMaxLines(2); - tipView.setTextColor(ContextCompat.getColor(mContext, R.color.qmui_config_color_white)); - tipView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14); + tipView.setTextSize(TypedValue.COMPLEX_UNIT_PX, + QMUIResHelper.getAttrDimen(dialogContext, R.attr.qmui_tip_dialog_text_size)); + tipView.setTextColor(QMUIResHelper.getAttrColor( + dialogContext, R.attr.qmui_skin_support_tip_dialog_text_color)); tipView.setText(mTipWord); - contentWrap.addView(tipView); + builder.clear(); + builder.textColor(QMUIResHelper.getAttrString( + dialogContext, R.attr.qmui_skin_def_tip_dialog_text_color)); + QMUISkinHelper.setSkinValue(tipView, builder); + dialogView.addView(tipView, onCreateTextLayoutParams(dialogContext, mCurrentIconType)); } + builder.release(); + dialog.setContentView(dialogView); return dialog; } + protected LinearLayout.LayoutParams onCreateIconOrLoadingLayoutParams(Context context){ + return new LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + } + + protected LinearLayout.LayoutParams onCreateTextLayoutParams(Context context, @IconType int iconType){ + LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + if(iconType != ICON_TYPE_NOTHING){ + lp.topMargin = QMUIResHelper.getAttrDimen(context, R.attr.qmui_tip_dialog_text_margin_top); + } + return lp; + } + } /** - * 传入自定义的布局并使用这个布局生成 TipDialog + * CustomBuilder with xml layout */ public static class CustomBuilder { private Context mContext; private int mContentLayoutId; + private boolean mFollowSkin = true; public CustomBuilder(Context context) { mContext = context; } + public CustomBuilder setFollowSkin(boolean followSkin) { + mFollowSkin = followSkin; + return this; + } + public CustomBuilder setContent(@LayoutRes int layoutId) { mContentLayoutId = layoutId; return this; } - /** - * 创建 Dialog, 但没有弹出来, 如果要弹出来, 请调用返回值的 {@link Dialog#show()} 方法 - * - * @return 创建的 Dialog - */ public QMUITipDialog create() { QMUITipDialog dialog = new QMUITipDialog(mContext); - dialog.setContentView(R.layout.qmui_tip_dialog_layout); - ViewGroup contentWrap = (ViewGroup) dialog.findViewById(R.id.contentWrap); - LayoutInflater.from(mContext).inflate(mContentLayoutId, contentWrap, true); + dialog.setFollowSkin(mFollowSkin); + Context dialogContext = dialog.getContext(); + QMUITipDialogView tipDialogView = new QMUITipDialogView(dialogContext); + LayoutInflater.from(dialogContext).inflate(mContentLayoutId, tipDialogView, true); + dialog.setContentView(tipDialogView); return dialog; } } diff --git a/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUITipDialogView.java b/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUITipDialogView.java new file mode 100644 index 00000000..cf0dda8e --- /dev/null +++ b/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUITipDialogView.java @@ -0,0 +1,78 @@ +/* + * Tencent is pleased to support the open source community by making QMUI_Android available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the MIT License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * http://opensource.org/licenses/MIT + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is + * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.qmuiteam.qmui.widget.dialog; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.view.Gravity; + +import com.qmuiteam.qmui.R; +import com.qmuiteam.qmui.layout.QMUILinearLayout; +import com.qmuiteam.qmui.skin.QMUISkinHelper; +import com.qmuiteam.qmui.skin.QMUISkinValueBuilder; +import com.qmuiteam.qmui.util.QMUIResHelper; + +public class QMUITipDialogView extends QMUILinearLayout { + + private final int mMaxWidth; + private final int mMiniWidth; + private final int mMiniHeight; + + public QMUITipDialogView(Context context) { + super(context); + setOrientation(VERTICAL); + setGravity(Gravity.CENTER_HORIZONTAL); + int radius = QMUIResHelper.getAttrDimen(context, R.attr.qmui_tip_dialog_radius); + Drawable background = QMUIResHelper.getAttrDrawable(context, R.attr.qmui_skin_support_tip_dialog_bg); + int paddingHor = QMUIResHelper.getAttrDimen(context, R.attr.qmui_tip_dialog_padding_horizontal); + int paddingVer = QMUIResHelper.getAttrDimen(context, R.attr.qmui_tip_dialog_padding_vertical); + setBackground(background); + setPadding(paddingHor, paddingVer, paddingHor, paddingVer); + setRadius(radius); + QMUISkinValueBuilder builder = QMUISkinValueBuilder.acquire(); + builder.background(QMUIResHelper.getAttrString(context, R.attr.qmui_skin_def_tip_dialog_bg)); + QMUISkinHelper.setSkinValue(this, builder); + builder.release(); + mMaxWidth = QMUIResHelper.getAttrDimen(context, R.attr.qmui_tip_dialog_max_width); + mMiniWidth = QMUIResHelper.getAttrDimen(context, R.attr.qmui_tip_dialog_min_width); + mMiniHeight = QMUIResHelper.getAttrDimen(context, R.attr.qmui_tip_dialog_min_height); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int widthSize = MeasureSpec.getSize(widthMeasureSpec); + int widthMode = MeasureSpec.getMode(widthMeasureSpec); + if(widthSize > mMaxWidth){ + widthMeasureSpec = MeasureSpec.makeMeasureSpec(mMaxWidth, widthMode); + } + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + boolean needRemeasure = false; + if(getMeasuredWidth() < mMiniWidth){ + widthMeasureSpec = MeasureSpec.makeMeasureSpec(mMiniWidth, MeasureSpec.EXACTLY); + needRemeasure = true; + } + + if(getMeasuredHeight() < mMiniHeight){ + heightMeasureSpec = MeasureSpec.makeMeasureSpec(mMiniHeight, MeasureSpec.EXACTLY); + needRemeasure = true; + } + + if(needRemeasure){ + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + } +} diff --git a/qmui/src/main/res/drawable/qmui_dialog_bg.xml b/qmui/src/main/res/drawable/qmui_dialog_bg.xml deleted file mode 100644 index 1d5b147c..00000000 --- a/qmui/src/main/res/drawable/qmui_dialog_bg.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/qmui/src/main/res/drawable/qmui_tip_dialog_bg.xml b/qmui/src/main/res/drawable/qmui_tip_dialog_bg.xml deleted file mode 100644 index 062a2e97..00000000 --- a/qmui/src/main/res/drawable/qmui_tip_dialog_bg.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/qmui/src/main/res/layout/qmui_tip_dialog_layout.xml b/qmui/src/main/res/layout/qmui_tip_dialog_layout.xml deleted file mode 100644 index 07e42c75..00000000 --- a/qmui/src/main/res/layout/qmui_tip_dialog_layout.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/qmui/src/main/res/values/qmui_attrs_base.xml b/qmui/src/main/res/values/qmui_attrs_base.xml index 3915f95f..156d4366 100644 --- a/qmui/src/main/res/values/qmui_attrs_base.xml +++ b/qmui/src/main/res/values/qmui_attrs_base.xml @@ -235,13 +235,32 @@ - - - - + + + + - + + + + + + + + + + + + + + + + + + - - - - - - - - - - \ No newline at end of file diff --git a/qmui/src/main/res/values/qmui_style_widget.xml b/qmui/src/main/res/values/qmui_style_widget.xml index 8ac32c47..c68088fa 100644 --- a/qmui/src/main/res/values/qmui_style_widget.xml +++ b/qmui/src/main/res/values/qmui_style_widget.xml @@ -25,6 +25,24 @@ left + + @@ -187,7 +204,6 @@ 27dp -