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 @@
-
-
-
-