From 420cc37196caa3953d563355ca1d980b8b08642e Mon Sep 17 00:00:00 2001 From: cgspine Date: Tue, 12 May 2020 15:59:29 +0800 Subject: [PATCH] bugfix: BottomSheet Context --- .../qmui/skin/QMUISkinLayoutInflaterFactory.java | 11 +++++++++-- .../qmui/widget/dialog/QMUIBaseDialog.java | 15 +++++++++++++++ .../qmui/widget/dialog/QMUIBottomSheet.java | 5 ++++- .../qmui/widget/dialog/QMUITipDialog.java | 6 ++++-- .../fragment/components/QDEmptyViewFragment.java | 2 ++ 5 files changed, 34 insertions(+), 5 deletions(-) diff --git a/qmui/src/main/java/com/qmuiteam/qmui/skin/QMUISkinLayoutInflaterFactory.java b/qmui/src/main/java/com/qmuiteam/qmui/skin/QMUISkinLayoutInflaterFactory.java index 087afe5d..4a744a9c 100644 --- a/qmui/src/main/java/com/qmuiteam/qmui/skin/QMUISkinLayoutInflaterFactory.java +++ b/qmui/src/main/java/com/qmuiteam/qmui/skin/QMUISkinLayoutInflaterFactory.java @@ -52,6 +52,13 @@ public class QMUISkinLayoutInflaterFactory implements LayoutInflater.Factory2 { mOriginLayoutInflater = originLayoutInflater; } + public QMUISkinLayoutInflaterFactory cloneForLayoutInflaterIfNeeded(LayoutInflater layoutInflater){ + if(mOriginLayoutInflater.getContext() == layoutInflater.getContext()){ + return this; + } + return new QMUISkinLayoutInflaterFactory(mActivityWeakReference.get(), layoutInflater); + } + @Override public View onCreateView(View parent, String name, Context context, AttributeSet attrs) { Activity activity = mActivityWeakReference.get(); @@ -64,7 +71,7 @@ public class QMUISkinLayoutInflaterFactory implements LayoutInflater.Factory2 { try{ if (!name.contains(".")) { if(sSuccessClassNamePrefixMap.containsKey(name)){ - view = LayoutInflater.from(context) + view = mOriginLayoutInflater .createView(name, sSuccessClassNamePrefixMap.get(name), attrs); }else{ for (String prefix : sClassPrefixList) { @@ -76,7 +83,7 @@ public class QMUISkinLayoutInflaterFactory implements LayoutInflater.Factory2 { } } }else{ - view = mOriginLayoutInflater.createView(name, null, attrs); + view = mOriginLayoutInflater.cloneInContext(context).createView(name, null, attrs); } }catch (ClassNotFoundException ignore){ diff --git a/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBaseDialog.java b/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBaseDialog.java index 8c398f45..60450693 100644 --- a/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBaseDialog.java +++ b/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBaseDialog.java @@ -18,13 +18,16 @@ package com.qmuiteam.qmui.widget.dialog; import android.content.Context; import android.content.res.TypedArray; +import android.view.LayoutInflater; import android.view.Window; +import com.qmuiteam.qmui.skin.QMUISkinLayoutInflaterFactory; import com.qmuiteam.qmui.skin.QMUISkinManager; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatDialog; +import androidx.core.view.LayoutInflaterCompat; public class QMUIBaseDialog extends AppCompatDialog { boolean cancelable = true; @@ -55,6 +58,18 @@ public class QMUIBaseDialog extends AppCompatDialog { } } + @NonNull + @Override + public LayoutInflater getLayoutInflater() { + LayoutInflater layoutInflater = super.getLayoutInflater(); + LayoutInflater.Factory2 factory2 = layoutInflater.getFactory2(); + if(factory2 instanceof QMUISkinLayoutInflaterFactory){ + LayoutInflaterCompat.setFactory2(layoutInflater, + ((QMUISkinLayoutInflaterFactory)factory2).cloneForLayoutInflaterIfNeeded(layoutInflater)); + } + return layoutInflater; + } + @Override protected void onStop() { super.onStop(); diff --git a/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheet.java b/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheet.java index de7baedc..3a65f118 100644 --- a/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheet.java +++ b/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheet.java @@ -22,6 +22,7 @@ import android.graphics.Typeface; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; +import android.text.Layout; import android.util.Pair; import android.view.LayoutInflater; import android.view.MotionEvent; @@ -34,6 +35,7 @@ import android.widget.LinearLayout; import com.google.android.material.bottomsheet.BottomSheetBehavior; import com.qmuiteam.qmui.R; import com.qmuiteam.qmui.layout.QMUIPriorityLinearLayout; +import com.qmuiteam.qmui.skin.QMUISkinLayoutInflaterFactory; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -44,6 +46,7 @@ import androidx.annotation.IntDef; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.coordinatorlayout.widget.CoordinatorLayout; +import androidx.core.view.LayoutInflaterCompat; import androidx.core.view.ViewCompat; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -75,7 +78,7 @@ public class QMUIBottomSheet extends QMUIBaseDialog { public QMUIBottomSheet(Context context, int style) { super(context, style); - ViewGroup container = (ViewGroup) View.inflate(context, R.layout.qmui_bottom_sheet_dialog, null); + ViewGroup container = (ViewGroup) getLayoutInflater().inflate(R.layout.qmui_bottom_sheet_dialog, null); mRootView = container.findViewById(R.id.bottom_sheet); mBehavior = new QMUIBottomSheetBehavior<>(); mBehavior.setHideable(cancelable); 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 f6be7091..b4dbc485 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 @@ -174,7 +174,7 @@ public class QMUITipDialog extends QMUIBaseDialog { } else if (mCurrentIconType == ICON_TYPE_SUCCESS || mCurrentIconType == ICON_TYPE_FAIL || mCurrentIconType == ICON_TYPE_INFO) { - ImageView imageView = new AppCompatImageView(mContext); + ImageView imageView = new AppCompatImageView(dialogContext); builder.clear(); Drawable drawable; @@ -198,7 +198,7 @@ public class QMUITipDialog extends QMUIBaseDialog { } if (mTipWord != null && mTipWord.length() > 0) { - TextView tipView = new QMUISpanTouchFixTextView(mContext); + TextView tipView = new QMUISpanTouchFixTextView(dialogContext); tipView.setEllipsize(TextUtils.TruncateAt.END); tipView.setGravity(Gravity.CENTER); tipView.setTextSize(TypedValue.COMPLEX_UNIT_PX, @@ -222,6 +222,8 @@ public class QMUITipDialog extends QMUIBaseDialog { 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); diff --git a/qmuidemo/src/main/java/com/qmuiteam/qmuidemo/fragment/components/QDEmptyViewFragment.java b/qmuidemo/src/main/java/com/qmuiteam/qmuidemo/fragment/components/QDEmptyViewFragment.java index 027cc44a..c45485fc 100644 --- a/qmuidemo/src/main/java/com/qmuiteam/qmuidemo/fragment/components/QDEmptyViewFragment.java +++ b/qmuidemo/src/main/java/com/qmuiteam/qmuidemo/fragment/components/QDEmptyViewFragment.java @@ -19,6 +19,7 @@ package com.qmuiteam.qmuidemo.fragment.components; import android.view.LayoutInflater; import android.view.View; +import com.qmuiteam.qmui.skin.QMUISkinManager; import com.qmuiteam.qmui.widget.QMUIEmptyView; import com.qmuiteam.qmui.widget.QMUITopBarLayout; import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet; @@ -78,6 +79,7 @@ public class QDEmptyViewFragment extends BaseFragment { private void showBottomSheetList() { new QMUIBottomSheet.BottomListSheetBuilder(getActivity()) + .setSkinManager(QMUISkinManager.defaultInstance(getContext())) .addItem(getResources().getString(R.string.emptyView_mode_title_double_text)) .addItem(getResources().getString(R.string.emptyView_mode_title_single_text)) .addItem(getResources().getString(R.string.emptyView_mode_title_loading))