From 874fb0a3c9f5c2e1f81c0a7764b88196dcb3f341 Mon Sep 17 00:00:00 2001 From: cgspine Date: Mon, 4 Nov 2019 22:33:44 +0800 Subject: [PATCH] refactor dialog --- build.gradle | 5 +- lint/build.gradle | 1 - qmui/build.gradle | 1 - .../qmui/widget/dialog/QMUIBottomSheet.java | 402 ++++-------------- .../dialog/QMUIBottomSheetBaseBuilder.java | 2 +- .../dialog/QMUIBottomSheetGridItemModel.java | 93 ++++ .../dialog/QMUIBottomSheetGridItemView.java | 163 +++++++ .../dialog/QMUIBottomSheetGridLineLayout.java | 155 +++++++ .../dialog/QMUIBottomSheetItemView.java | 71 ---- .../dialog/QMUIBottomSheetListAdapter.java | 8 +- ...java => QMUIBottomSheetListItemModel.java} | 27 +- .../dialog/QMUIBottomSheetListItemView.java | 7 +- .../dialog/QMUIBottomSheetRootLayout.java | 7 + .../res/layout/qmui_bottom_sheet_grid.xml | 82 ---- .../layout/qmui_bottom_sheet_grid_item.xml | 53 --- .../qmui_bottom_sheet_grid_item_subscript.xml | 24 -- .../qmui_bottom_sheet_list_item_mark.xml | 25 -- qmui/src/main/res/values/qmui_attrs_base.xml | 35 +- .../src/main/res/values/qmui_style_widget.xml | 14 + qmui/src/main/res/values/qmui_themes.xml | 38 +- qmuidemo/build.gradle | 1 - .../components/QDBottomSheetFragment.java | 1 + qmuidemo/src/main/res/values/theme.xml | 3 +- skin-maker/build.gradle | 1 - 24 files changed, 574 insertions(+), 645 deletions(-) create mode 100644 qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheetGridItemModel.java create mode 100644 qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheetGridItemView.java create mode 100644 qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheetGridLineLayout.java delete mode 100644 qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheetItemView.java rename qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/{QMUIBottomSheetItemModel.java => QMUIBottomSheetListItemModel.java} (65%) delete mode 100644 qmui/src/main/res/layout/qmui_bottom_sheet_grid.xml delete mode 100644 qmui/src/main/res/layout/qmui_bottom_sheet_grid_item.xml delete mode 100644 qmui/src/main/res/layout/qmui_bottom_sheet_grid_item_subscript.xml delete mode 100644 qmui/src/main/res/layout/qmui_bottom_sheet_list_item_mark.xml diff --git a/build.gradle b/build.gradle index bfd6bbda1..dc3db3a93 100644 --- a/build.gradle +++ b/build.gradle @@ -25,10 +25,9 @@ allprojects { } ext { - buildToolsVersion = "28.0.3" minSdkVersion = 19 - targetSdkVersion = 28 - compileSdkVersion = 28 + targetSdkVersion = 29 + compileSdkVersion = 29 appcompatVersion= '1.1.0' materialVersion='1.2.0-alpha01' annotationVersion='1.1.0-beta01' diff --git a/lint/build.gradle b/lint/build.gradle index 4591665f2..31af1bf3d 100644 --- a/lint/build.gradle +++ b/lint/build.gradle @@ -4,7 +4,6 @@ version = QMUI_LINT_VERSION android { compileSdkVersion project.ext.compileSdkVersion - buildToolsVersion project.ext.buildToolsVersion defaultConfig { minSdkVersion 14 diff --git a/qmui/build.gradle b/qmui/build.gradle index 6cc2beb18..6bfbc6341 100644 --- a/qmui/build.gradle +++ b/qmui/build.gradle @@ -5,7 +5,6 @@ version = QMUI_VERSION //noinspection GroovyMissingReturnStatement android { compileSdkVersion parent.ext.compileSdkVersion - buildToolsVersion parent.ext.buildToolsVersion lintOptions { abortOnError false } 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 f2552d402..eaca699ee 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,32 +22,17 @@ import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; -import android.util.SparseArray; -import android.view.Gravity; +import android.util.Pair; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; -import android.view.ViewStub; import android.view.Window; import android.view.WindowManager; -import android.widget.BaseAdapter; -import android.widget.ImageView; import android.widget.LinearLayout; -import android.widget.ListView; -import android.widget.TextView; import com.google.android.material.bottomsheet.BottomSheetBehavior; -import com.google.android.material.bottomsheet.BottomSheetDialog; import com.qmuiteam.qmui.R; -import com.qmuiteam.qmui.layout.QMUIButton; -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.QMUILangHelper; -import com.qmuiteam.qmui.util.QMUIResHelper; -import com.qmuiteam.qmui.widget.textview.QMUISpanTouchFixTextView; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -57,15 +42,8 @@ import androidx.annotation.IntDef; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.appcompat.content.res.AppCompatResources; -import androidx.appcompat.widget.AppCompatImageView; import androidx.coordinatorlayout.widget.CoordinatorLayout; -import androidx.core.content.ContextCompat; -import androidx.core.view.AccessibilityDelegateCompat; -import androidx.core.view.ViewCompat; -import androidx.core.view.accessibility.AccessibilityNodeInfoCompat; import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.ListAdapter; import androidx.recyclerview.widget.RecyclerView; import static com.qmuiteam.qmui.layout.IQMUILayout.HIDE_RADIUS_SIDE_BOTTOM; @@ -102,14 +80,14 @@ public QMUIBottomSheet(Context context, int style) { mBehavior.addBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() { @Override public void onStateChanged(@NonNull View bottomSheet, int newState) { - if(newState == BottomSheetBehavior.STATE_HIDDEN){ - if(mAnimateToCancel){ + if (newState == BottomSheetBehavior.STATE_HIDDEN) { + if (mAnimateToCancel) { // cancel() invoked cancel(); - }else if(mAnimateToDismiss){ + } else if (mAnimateToDismiss) { // dismiss() invoked but it it not triggered by cancel() dismiss(); - }else{ + } else { // drag to cancel cancel(); } @@ -222,7 +200,7 @@ public void show() { if (mOnBottomSheetShowListener != null) { mOnBottomSheetShowListener.onShow(); } - if(mBehavior.getState() != BottomSheetBehavior.STATE_EXPANDED){ + if (mBehavior.getState() != BottomSheetBehavior.STATE_EXPANDED) { mRootView.postOnAnimation(new Runnable() { @Override public void run() { @@ -282,7 +260,7 @@ public void addContentView(int layoutResId) { public static class BottomListSheetBuilder extends QMUIBottomSheetBaseBuilder { - private List mItems; + private List mItems; private List mContentHeaderViews; private List mContentFooterViews; private boolean mNeedRightMark; //是否需要rightMark,标识当前项 @@ -330,7 +308,7 @@ public BottomListSheetBuilder setOnSheetItemClickListener( return this; } - public BottomListSheetBuilder addItem(QMUIBottomSheetItemModel itemModel) { + public BottomListSheetBuilder addItem(QMUIBottomSheetListItemModel itemModel) { mItems.add(itemModel); return this; } @@ -339,7 +317,7 @@ public BottomListSheetBuilder addItem(QMUIBottomSheetItemModel itemModel) { * @param textAndTag Item 的文字内容,同时会把内容设置为 tag。 */ public BottomListSheetBuilder addItem(String textAndTag) { - mItems.add(new QMUIBottomSheetItemModel(textAndTag, textAndTag)); + mItems.add(new QMUIBottomSheetListItemModel(textAndTag, textAndTag)); return this; } @@ -348,7 +326,7 @@ public BottomListSheetBuilder addItem(String textAndTag) { * @param textAndTag Item 的文字内容,同时会把内容设置为 tag。 */ public BottomListSheetBuilder addItem(Drawable image, String textAndTag) { - mItems.add(new QMUIBottomSheetItemModel(textAndTag, textAndTag).image(image)); + mItems.add(new QMUIBottomSheetListItemModel(textAndTag, textAndTag).image(image)); return this; } @@ -357,7 +335,7 @@ public BottomListSheetBuilder addItem(Drawable image, String textAndTag) { * @param tag item 的 tag。 */ public BottomListSheetBuilder addItem(String text, String tag) { - mItems.add(new QMUIBottomSheetItemModel(text, tag)); + mItems.add(new QMUIBottomSheetListItemModel(text, tag)); return this; } @@ -367,7 +345,7 @@ public BottomListSheetBuilder addItem(String text, String tag) { * @param tag Item 的 tag。 */ public BottomListSheetBuilder addItem(int imageRes, String text, String tag) { - mItems.add(new QMUIBottomSheetItemModel(text, tag).image(imageRes)); + mItems.add(new QMUIBottomSheetListItemModel(text, tag).image(imageRes)); return this; } @@ -378,7 +356,7 @@ public BottomListSheetBuilder addItem(int imageRes, String text, String tag) { * @param hasRedPoint 是否显示红点。 */ public BottomListSheetBuilder addItem(int imageRes, String text, String tag, boolean hasRedPoint) { - mItems.add(new QMUIBottomSheetItemModel(text, tag).image(imageRes).redPoint(hasRedPoint)); + mItems.add(new QMUIBottomSheetListItemModel(text, tag).image(imageRes).redPoint(hasRedPoint)); return this; } @@ -390,8 +368,8 @@ public BottomListSheetBuilder addItem(int imageRes, String text, String tag, boo * @param disabled 是否显示禁用态。 */ public BottomListSheetBuilder addItem( - int imageRes, String text, String tag, boolean hasRedPoint, boolean disabled) { - mItems.add(new QMUIBottomSheetItemModel(text, tag) + int imageRes, CharSequence text, String tag, boolean hasRedPoint, boolean disabled) { + mItems.add(new QMUIBottomSheetListItemModel(text, tag) .image(imageRes).redPoint(hasRedPoint).disabled(disabled)); return this; } @@ -402,16 +380,16 @@ public BottomListSheetBuilder addHeaderView(@NonNull View view) { return addContentHeaderView(view); } - public BottomListSheetBuilder addContentHeaderView(@NonNull View view){ - if(mContentHeaderViews == null){ + public BottomListSheetBuilder addContentHeaderView(@NonNull View view) { + if (mContentHeaderViews == null) { mContentHeaderViews = new ArrayList<>(); } mContentHeaderViews.add(view); return this; } - public BottomListSheetBuilder addContentFooterView(@NonNull View view){ - if(mContentFooterViews == null){ + public BottomListSheetBuilder addContentFooterView(@NonNull View view) { + if (mContentFooterViews == null) { mContentFooterViews = new ArrayList<>(); } mContentFooterViews.add(view); @@ -427,7 +405,7 @@ protected View onCreateContentView(final QMUIBottomSheet bottomSheet, QMUIBottomSheetListAdapter adapter = new QMUIBottomSheetListAdapter( mNeedRightMark, mGravityCenter); recyclerView.setAdapter(adapter); - recyclerView.setLayoutManager(new LinearLayoutManager(context){ + recyclerView.setLayoutManager(new LinearLayoutManager(context) { @Override public RecyclerView.LayoutParams generateDefaultLayoutParams() { return new RecyclerView.LayoutParams( @@ -437,24 +415,24 @@ public RecyclerView.LayoutParams generateDefaultLayoutParams() { recyclerView.addItemDecoration(new QMUIBottomSheetListItemDecoration(context)); LinearLayout headerView = null; - if(mContentHeaderViews != null && mContentHeaderViews.size() > 0){ + if (mContentHeaderViews != null && mContentHeaderViews.size() > 0) { headerView = new LinearLayout(context); headerView.setOrientation(LinearLayout.VERTICAL); - for(View view: mContentHeaderViews){ - if(view.getParent() != null){ - ((ViewGroup)view.getParent()).removeView(view); + for (View view : mContentHeaderViews) { + if (view.getParent() != null) { + ((ViewGroup) view.getParent()).removeView(view); } headerView.addView(view, new LinearLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); } } LinearLayout footerView = null; - if(mContentFooterViews != null && mContentHeaderViews.size() > 0){ + if (mContentFooterViews != null && mContentHeaderViews.size() > 0) { footerView = new LinearLayout(context); footerView.setOrientation(LinearLayout.VERTICAL); - for(View view: mContentFooterViews){ - if(view.getParent() != null){ - ((ViewGroup)view.getParent()).removeView(view); + for (View view : mContentFooterViews) { + if (view.getParent() != null) { + ((ViewGroup) view.getParent()).removeView(view); } footerView.addView(view, new LinearLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); @@ -463,8 +441,8 @@ public RecyclerView.LayoutParams generateDefaultLayoutParams() { adapter.setData(headerView, footerView, mItems); adapter.setOnItemClickListener(new QMUIBottomSheetListAdapter.OnItemClickListener() { @Override - public void onClick(QMUIBottomSheetListAdapter.VH vh, int dataPos, QMUIBottomSheetItemModel model) { - if(mOnSheetItemClickListener != null){ + public void onClick(QMUIBottomSheetListAdapter.VH vh, int dataPos, QMUIBottomSheetListItemModel model) { + if (mOnSheetItemClickListener != null) { mOnSheetItemClickListener.onClick(bottomSheet, vh.itemView, dataPos, model.tag); } } @@ -483,75 +461,49 @@ public interface OnSheetItemClickListener { /** * 生成宫格类型的 {@link QMUIBottomSheet} 对话框。 */ - public static class BottomGridSheetBuilder implements View.OnClickListener { + public static class BottomGridSheetBuilder extends QMUIBottomSheetBaseBuilder + implements View.OnClickListener { + + public static final int FIRST_LINE = 0; + public static final int SECOND_LINE = 1; + public static final ItemViewFactory DEFAULT_ITEM_VIEW_FACTORY = new DefaultItemViewFactory(); + public interface ItemViewFactory { - View create(QMUIBottomSheet bottomSheet, int layoutRes, int style, View.OnClickListener onClickListener); + QMUIBottomSheetGridItemView create(QMUIBottomSheet bottomSheet, QMUIBottomSheetGridItemModel model); } public static class DefaultItemViewFactory implements ItemViewFactory { - private Drawable mDrawable; - private CharSequence mText; - private Object mTag; - private int mSubscriptRes; - private Typeface mTypeface; - - public DefaultItemViewFactory(Drawable drawable, CharSequence text, Object tag, int subscriptRes, Typeface typeface) { - mDrawable = drawable; - mText = text; - mTag = tag; - mSubscriptRes = subscriptRes; - mTypeface = typeface; - } @Override - public View create(QMUIBottomSheet bottomSheet, int layoutRes, int style, View.OnClickListener onClickListener) { - LayoutInflater inflater = LayoutInflater.from(bottomSheet.getContext()); - QMUIBottomSheetItemView itemView = (QMUIBottomSheetItemView) inflater.inflate(layoutRes, null, false); - TextView titleTV = itemView.findViewById(R.id.grid_item_title); - if (mTypeface != null) { - titleTV.setTypeface(mTypeface); - } - titleTV.setText(mText); - - itemView.setTag(mTag); - itemView.setOnClickListener(onClickListener); - AppCompatImageView imageView = itemView.findViewById(R.id.grid_item_image); - imageView.setImageDrawable(mDrawable); - - if (mSubscriptRes != 0) { - ViewStub stub = itemView.findViewById(R.id.grid_item_subscript); - View inflated = stub.inflate(); - ((ImageView) inflated).setImageResource(mSubscriptRes); - } + public QMUIBottomSheetGridItemView create(QMUIBottomSheet bottomSheet, QMUIBottomSheetGridItemModel model) { + QMUIBottomSheetGridItemView itemView = new QMUIBottomSheetGridItemView(bottomSheet.getContext()); + itemView.render(model); + itemView.setTag(model.tag); return itemView; } } - /** - * item 出现在第一行 - */ - public static final int FIRST_LINE = 0; - /** - * item 出现在第二行 - */ - public static final int SECOND_LINE = 1; - private Context mContext; - private QMUIBottomSheet mDialog; - private SparseArray mFirstLineViews; - private SparseArray mSecondLineViews; - private int mMiniItemWidth = -1; + private ArrayList mFirstLineItems; + private ArrayList mSecondLineItems; + private ItemViewFactory mItemViewFactory = DEFAULT_ITEM_VIEW_FACTORY; private OnSheetItemClickListener mOnSheetItemClickListener; - private ViewGroup mBottomButtonContainer; - private TextView mBottomButton; - private Typeface mBottomButtonTypeFace = null; - private boolean mIsShowButton = true; - private CharSequence mButtonText = null; - private View.OnClickListener mButtonClickListener = null; public BottomGridSheetBuilder(Context context) { - mContext = context; - mFirstLineViews = new SparseArray<>(); - mSecondLineViews = new SparseArray<>(); + super(context); + mFirstLineItems = new ArrayList<>(); + mSecondLineItems = new ArrayList<>(); + } + + public BottomGridSheetBuilder addItem(QMUIBottomSheetGridItemModel model, @Style int style) { + switch (style) { + case FIRST_LINE: + mFirstLineItems.add(model); + break; + case SECOND_LINE: + mSecondLineItems.add(model); + break; + } + return this; } public BottomGridSheetBuilder addItem(int imageRes, CharSequence textAndTag, @Style int style) { @@ -562,26 +514,6 @@ public BottomGridSheetBuilder addItem(int imageRes, CharSequence text, Object ta return addItem(imageRes, text, tag, style, 0); } - public BottomGridSheetBuilder setIsShowButton(boolean isShowButton) { - mIsShowButton = isShowButton; - return this; - } - - public BottomGridSheetBuilder setButtonText(CharSequence buttonText) { - mButtonText = buttonText; - return this; - } - - public BottomGridSheetBuilder setButtonClickListener(View.OnClickListener buttonClickListener) { - mButtonClickListener = buttonClickListener; - return this; - } - - public BottomGridSheetBuilder setBottomButtonTypeFace(Typeface bottomButtonTypeFace) { - mBottomButtonTypeFace = bottomButtonTypeFace; - return this; - } - public BottomGridSheetBuilder addItem(int imageRes, CharSequence text, Object tag, @Style int style, int subscriptRes) { return addItem(imageRes, text, tag, style, subscriptRes, null); @@ -589,54 +521,15 @@ public BottomGridSheetBuilder addItem(int imageRes, CharSequence text, Object ta public BottomGridSheetBuilder addItem(int imageRes, CharSequence text, Object tag, @Style int style, int subscriptRes, Typeface typeface) { - ItemViewFactory itemView = createItemViewFactory( - AppCompatResources.getDrawable(mContext, imageRes), text, tag, subscriptRes, typeface); - return addItem(itemView, style); - } - - public BottomGridSheetBuilder addItem(ItemViewFactory itemViewFactory, @Style int style) { - switch (style) { - case FIRST_LINE: - mFirstLineViews.append(mFirstLineViews.size(), itemViewFactory); - break; - case SECOND_LINE: - mSecondLineViews.append(mSecondLineViews.size(), itemViewFactory); - break; - } - return this; - } - - @Deprecated - public BottomGridSheetBuilder addItem(final View view, @Style int style) { - switch (style) { - case FIRST_LINE: - mFirstLineViews.append(mFirstLineViews.size(), new ItemViewFactory() { - @Override - public View create(QMUIBottomSheet bottomSheet, int layoutRes, int style, View.OnClickListener onClickListener) { - return view; - } - }); - break; - case SECOND_LINE: - mSecondLineViews.append(mSecondLineViews.size(), new ItemViewFactory() { - @Override - public View create(QMUIBottomSheet bottomSheet, int layoutRes, int style, View.OnClickListener onClickListener) { - return view; - } - }); - break; - } - return this; + return addItem(new QMUIBottomSheetGridItemModel(text, tag) + .image(imageRes) + .subscript(subscriptRes) + .typeface(typeface), style); } - public ItemViewFactory createItemViewFactory(Drawable drawable, CharSequence text, Object tag, - int subscriptRes) { - return createItemViewFactory(drawable, text, tag, subscriptRes, null); - } - public ItemViewFactory createItemViewFactory(Drawable drawable, CharSequence text, Object tag, - int subscriptRes, Typeface typeface) { - return new DefaultItemViewFactory(drawable, text, tag, subscriptRes, typeface); + public void setItemViewFactory(ItemViewFactory itemViewFactory) { + mItemViewFactory = itemViewFactory; } public BottomGridSheetBuilder setOnSheetItemClickListener(OnSheetItemClickListener onSheetItemClickListener) { @@ -651,148 +544,37 @@ public void onClick(View v) { } } - public QMUIBottomSheet build() { - return build(R.style.QMUI_BottomSheet); - } - - public QMUIBottomSheet build(int style) { - mDialog = new QMUIBottomSheet(mContext, style); - View contentView = buildViews(mDialog); - mDialog.setContentView(contentView, - new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); - return mDialog; - } - - public int getFirstLineContainerId() { - return R.id.bottom_sheet_first_linear_layout; - } - - public int getSecondLineContainerId() { - return R.id.bottom_sheet_second_linear_layout; - } - - private View buildViews(QMUIBottomSheet bottomSheet) { - LinearLayout baseLinearLayout; - baseLinearLayout = (LinearLayout) View.inflate(bottomSheet.getContext(), getContentViewLayoutId(), null); - LinearLayout firstLine = baseLinearLayout.findViewById(getFirstLineContainerId()); - LinearLayout secondLine = baseLinearLayout.findViewById(getSecondLineContainerId()); - mBottomButtonContainer = baseLinearLayout.findViewById(R.id.bottom_sheet_button_container); - mBottomButton = baseLinearLayout.findViewById(R.id.bottom_sheet_close_button); - - int maxItemCountEachLine = Math.max(mFirstLineViews.size(), mSecondLineViews.size()); - int screenWidth = QMUIDisplayHelper.getScreenWidth(bottomSheet.getContext()); - int screenHeight = QMUIDisplayHelper.getScreenHeight(bottomSheet.getContext()); - int width = screenWidth < screenHeight ? screenWidth : screenHeight; - int itemWidth = calculateItemWidth(width, maxItemCountEachLine, firstLine.getPaddingLeft(), firstLine.getPaddingRight()); - - addViewsInSection(bottomSheet, mFirstLineViews, firstLine, itemWidth, FIRST_LINE); - addViewsInSection(bottomSheet, mSecondLineViews, secondLine, itemWidth, SECOND_LINE); - - boolean hasFirstLine = mFirstLineViews.size() > 0; - boolean hasSecondLine = mSecondLineViews.size() > 0; - if (!hasFirstLine) { - firstLine.setVisibility(View.GONE); + @Nullable + @Override + protected View onCreateContentView(QMUIBottomSheet bottomSheet, QMUIBottomSheetRootLayout rootLayout, Context context) { + if (mFirstLineItems.isEmpty() && mSecondLineItems.isEmpty()) { + return null; } - if (!hasSecondLine) { - if (hasFirstLine) { - firstLine.setPadding( - firstLine.getPaddingLeft(), - firstLine.getPaddingTop(), - firstLine.getPaddingRight(), - 0); + List> firstLines = null; + List> secondLines = null; + int wrapContent = ViewGroup.LayoutParams.WRAP_CONTENT; + + if (!mFirstLineItems.isEmpty()) { + firstLines = new ArrayList<>(); + for (QMUIBottomSheetGridItemModel model : mFirstLineItems) { + QMUIBottomSheetGridItemView itemView = mItemViewFactory.create(bottomSheet, model); + itemView.setOnClickListener(this); + firstLines.add(new Pair( + itemView, + new LinearLayout.LayoutParams(wrapContent, wrapContent))); } - secondLine.setVisibility(View.GONE); } - - // button 在用户自定义了contentView的情况下可能不存在 - if (mBottomButtonContainer != null) { - if (mIsShowButton) { - mBottomButtonContainer.setVisibility(View.VISIBLE); - baseLinearLayout.setPadding(baseLinearLayout.getPaddingLeft(), - baseLinearLayout.getPaddingTop(), - baseLinearLayout.getPaddingRight(), - 0); - } else { - mBottomButtonContainer.setVisibility(View.GONE); - } - if (mBottomButtonTypeFace != null) { - mBottomButton.setTypeface(mBottomButtonTypeFace); + if (!mSecondLineItems.isEmpty()) { + secondLines = new ArrayList<>(); + for (QMUIBottomSheetGridItemModel model : mSecondLineItems) { + QMUIBottomSheetGridItemView itemView = mItemViewFactory.create(bottomSheet, model); + itemView.setOnClickListener(this); + secondLines.add(new Pair( + itemView, + new LinearLayout.LayoutParams(wrapContent, wrapContent))); } - if (mButtonText != null) { - mBottomButton.setText(mButtonText); - } - - if (mButtonClickListener != null) { - mBottomButton.setOnClickListener(mButtonClickListener); - } else { - mBottomButton.setOnClickListener(new View.OnClickListener() { - - @Override - public void onClick(View v) { - mDialog.dismiss(); - } - }); - } - } - - return baseLinearLayout; - } - - protected int getContentViewLayoutId() { - return R.layout.qmui_bottom_sheet_grid; - } - - protected int getItemViewLayoutId() { - return R.layout.qmui_bottom_sheet_grid_item; - } - - /** - * 拿个数最多的一行,去决策item的平铺/拉伸策略 - * - * @return item 宽度 - */ - private int calculateItemWidth(int width, int maxItemCountInEachLine, int paddingLeft, int paddingRight) { - if (mMiniItemWidth == -1) { - mMiniItemWidth = QMUIResHelper.getAttrDimen(mContext, R.attr.qmui_bottom_sheet_grid_item_mini_width); - } - - final int parentSpacing = width - paddingLeft - paddingRight; - int itemWidth = mMiniItemWidth; - // 看是否需要把 Item 拉伸平分 parentSpacing - if (maxItemCountInEachLine >= 3 - && parentSpacing - maxItemCountInEachLine * itemWidth > 0 - && parentSpacing - maxItemCountInEachLine * itemWidth < itemWidth) { - int count = parentSpacing / itemWidth; - itemWidth = parentSpacing / count; - } - // 看是否需要露出半个在屏幕边缘 - if (itemWidth * maxItemCountInEachLine > parentSpacing) { - int count = (width - paddingLeft) / itemWidth; - itemWidth = (int) ((width - paddingLeft) / (count + .5f)); - } - return itemWidth; - } - - private void addViewsInSection(QMUIBottomSheet bottomSheet, SparseArray items, - LinearLayout parent, int itemWidth, int style) { - - for (int i = 0; i < items.size(); i++) { - View itemView = items.get(i).create(bottomSheet, getItemViewLayoutId(), style, this); - setItemWidth(itemView, itemWidth); - parent.addView(itemView); - } - } - - private void setItemWidth(View itemView, int itemWidth) { - LinearLayout.LayoutParams itemLp; - if (itemView.getLayoutParams() != null) { - itemLp = (LinearLayout.LayoutParams) itemView.getLayoutParams(); - itemLp.width = itemWidth; - } else { - itemLp = new LinearLayout.LayoutParams(itemWidth, ViewGroup.LayoutParams.WRAP_CONTENT); - itemView.setLayoutParams(itemLp); } - itemLp.gravity = Gravity.TOP; + return new QMUIBottomSheetGridLineLayout(mDialog, firstLines, secondLines); } public interface OnSheetItemClickListener { diff --git a/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheetBaseBuilder.java b/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheetBaseBuilder.java index 4010c2866..fe05ce095 100644 --- a/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheetBaseBuilder.java +++ b/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheetBaseBuilder.java @@ -36,7 +36,7 @@ public abstract class QMUIBottomSheetBaseBuilder { private Context mContext; - private QMUIBottomSheet mDialog; + protected QMUIBottomSheet mDialog; private CharSequence mTitle; private boolean mAddCancelBtn; private String mCancelText; diff --git a/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheetGridItemModel.java b/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheetGridItemModel.java new file mode 100644 index 000000000..3a48968c6 --- /dev/null +++ b/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheetGridItemModel.java @@ -0,0 +1,93 @@ +/* + * 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.graphics.Typeface; +import android.graphics.drawable.Drawable; + +public class QMUIBottomSheetGridItemModel { + Drawable image = null; + int imageRes = 0; + int imageSkinTintColorAttr = 0; + int imageSkinSrcAttr = 0; + int textSkinColorAttr = 0; + CharSequence text; + Object tag = ""; + Drawable subscript = null; + int subscriptRes = 0; + int subscriptSkinTintColorAttr = 0; + int subscriptSkinSrcAttr = 0; + Typeface typeface; + + public QMUIBottomSheetGridItemModel(CharSequence text, Object tag) { + this.text = text; + this.tag = tag; + } + + public QMUIBottomSheetGridItemModel image(Drawable image) { + this.image = image; + return this; + } + + public QMUIBottomSheetGridItemModel image(int imageRes) { + this.imageRes = imageRes; + return this; + } + + public QMUIBottomSheetGridItemModel subscript(Drawable image) { + this.subscript = image; + return this; + } + + public QMUIBottomSheetGridItemModel subscript(int imageRes) { + this.subscriptRes = imageRes; + return this; + } + + + public QMUIBottomSheetGridItemModel skinTextColorAttr(int attr) { + this.textSkinColorAttr = attr; + return this; + } + + + public QMUIBottomSheetGridItemModel skinImageTintColorAttr(int attr) { + this.imageSkinTintColorAttr = attr; + return this; + } + + public QMUIBottomSheetGridItemModel skinImageSrcAttr(int attr) { + this.imageSkinSrcAttr = attr; + return this; + } + + public QMUIBottomSheetGridItemModel skinSubscriptTintColorAttr(int attr) { + this.subscriptSkinTintColorAttr = attr; + return this; + } + + public QMUIBottomSheetGridItemModel skinSubscriptSrcAttr(int attr) { + this.subscriptSkinSrcAttr = attr; + return this; + } + + public QMUIBottomSheetGridItemModel typeface(Typeface typeface) { + this.typeface = typeface; + return this; + } + +} diff --git a/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheetGridItemView.java b/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheetGridItemView.java new file mode 100644 index 000000000..aeb77ae7b --- /dev/null +++ b/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheetGridItemView.java @@ -0,0 +1,163 @@ +/* + * 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.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import com.qmuiteam.qmui.R; +import com.qmuiteam.qmui.layout.QMUIConstraintLayout; +import com.qmuiteam.qmui.skin.QMUISkinHelper; +import com.qmuiteam.qmui.skin.QMUISkinManager; +import com.qmuiteam.qmui.skin.QMUISkinValueBuilder; +import com.qmuiteam.qmui.skin.defaultAttr.QMUISkinSimpleDefaultAttrProvider; +import com.qmuiteam.qmui.util.QMUIResHelper; +import com.qmuiteam.qmui.widget.textview.QMUISpanTouchFixTextView; + +import androidx.appcompat.widget.AppCompatImageView; +import androidx.core.content.ContextCompat; + + +public class QMUIBottomSheetGridItemView extends QMUIConstraintLayout { + + private AppCompatImageView mIconIv; + private AppCompatImageView mSubscriptIv; + private TextView mTitleTv; + + + public QMUIBottomSheetGridItemView(Context context) { + this(context, null); + } + + public QMUIBottomSheetGridItemView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public QMUIBottomSheetGridItemView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + setChangeAlphaWhenPress(true); + int paddingVer = QMUIResHelper.getAttrDimen(context, R.attr.qmui_bottom_sheet_grid_item_padding_ver); + setPadding(0, paddingVer, 0, paddingVer); + mIconIv = new AppCompatImageView(context); + mIconIv.setId(View.generateViewId()); + mIconIv.setScaleType(ImageView.ScaleType.CENTER_INSIDE); + + int iconSize = QMUIResHelper.getAttrDimen(context, R.attr.qmui_bottom_sheet_grid_item_icon_size); + LayoutParams iconLp = new LayoutParams(iconSize, iconSize); + iconLp.leftToLeft = LayoutParams.PARENT_ID; + iconLp.rightToRight = LayoutParams.PARENT_ID; + iconLp.topToTop = LayoutParams.PARENT_ID; + addView(mIconIv, iconLp); + + mTitleTv = new QMUISpanTouchFixTextView(context); + mTitleTv.setId(View.generateViewId()); + QMUISkinSimpleDefaultAttrProvider provider = new QMUISkinSimpleDefaultAttrProvider(); + provider.setDefaultSkinAttr(QMUISkinValueBuilder.TEXT_COLOR, + R.attr.qmui_skin_support_bottom_sheet_grid_item_text_color); + QMUIResHelper.assignTextViewWithAttr(mTitleTv, R.attr.qmui_bottom_sheet_grid_item_text_style); + QMUISkinHelper.setSkinDefaultProvider(mTitleTv, provider); + + LayoutParams titleLp = new LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + titleLp.leftToLeft = LayoutParams.PARENT_ID; + titleLp.rightToRight = LayoutParams.PARENT_ID; + titleLp.topToBottom = mIconIv.getId(); + titleLp.topMargin = QMUIResHelper.getAttrDimen( + context, R.attr.qmui_bottom_sheet_grid_item_text_margin_top); + addView(mTitleTv, titleLp); + } + + public void render(QMUIBottomSheetGridItemModel model) { + QMUISkinValueBuilder builder = QMUISkinValueBuilder.acquire(); + if (model.imageSkinSrcAttr != 0) { + builder.src(model.imageSkinSrcAttr); + QMUISkinHelper.setSkinValue(mIconIv, builder); + Drawable drawable = QMUISkinHelper.getSkinDrawable(mIconIv, model.imageSkinSrcAttr); + mIconIv.setImageDrawable(drawable); + } else { + Drawable drawable = model.image; + if (drawable == null && model.imageRes != 0) { + drawable = ContextCompat.getDrawable(getContext(), model.imageRes); + } + if (drawable != null) { + drawable.mutate(); + } + mIconIv.setImageDrawable(drawable); + if (model.imageSkinTintColorAttr != 0) { + builder.tintColor(model.imageSkinTintColorAttr); + QMUISkinHelper.setSkinValue(mIconIv, builder); + QMUISkinManager.defaultInstance(getContext()).refreshTheme(mIconIv); + } else { + QMUISkinHelper.setSkinValue(mIconIv, ""); + } + } + builder.clear(); + mTitleTv.setText(model.text); + if (model.textSkinColorAttr != 0) { + builder.textColor(model.textSkinColorAttr); + } + QMUISkinHelper.setSkinValue(mTitleTv, builder); + QMUISkinManager.defaultInstance(getContext()).refreshTheme(mTitleTv); + if(model.typeface != null){ + mTitleTv.setTypeface(model.typeface); + } + builder.clear(); + + if (model.subscriptRes != 0 || model.subscript != null || model.subscriptSkinSrcAttr != 0) { + if (mSubscriptIv == null) { + mSubscriptIv = new AppCompatImageView(getContext()); + mSubscriptIv.setScaleType(ImageView.ScaleType.CENTER_INSIDE); + LayoutParams lp = new LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + lp.rightToRight = mIconIv.getId(); + lp.topToTop = mIconIv.getId(); + addView(mSubscriptIv, lp); + } + mSubscriptIv.setVisibility(View.VISIBLE); + if (model.subscriptSkinSrcAttr != 0) { + builder.src(model.subscriptSkinSrcAttr); + QMUISkinHelper.setSkinValue(mSubscriptIv, builder); + Drawable drawable = QMUISkinHelper.getSkinDrawable(mSubscriptIv, model.subscriptSkinSrcAttr); + mIconIv.setImageDrawable(drawable); + } else { + Drawable drawable = model.subscript; + if (drawable == null && model.subscriptRes != 0) { + drawable = ContextCompat.getDrawable(getContext(), model.subscriptRes); + } + if (drawable != null) { + drawable.mutate(); + } + mSubscriptIv.setImageDrawable(drawable); + if (model.subscriptSkinTintColorAttr != 0) { + builder.tintColor(model.subscriptSkinTintColorAttr); + QMUISkinHelper.setSkinValue(mSubscriptIv, builder); + QMUISkinManager.defaultInstance(getContext()).refreshTheme(mSubscriptIv); + } else { + QMUISkinHelper.setSkinValue(mSubscriptIv, ""); + } + } + } else if (mSubscriptIv != null) { + mSubscriptIv.setVisibility(View.GONE); + } + builder.release(); + } +} diff --git a/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheetGridLineLayout.java b/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheetGridLineLayout.java new file mode 100644 index 000000000..14821619c --- /dev/null +++ b/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheetGridLineLayout.java @@ -0,0 +1,155 @@ +/* + * 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.util.Pair; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.widget.HorizontalScrollView; +import android.widget.LinearLayout; + +import com.qmuiteam.qmui.R; +import com.qmuiteam.qmui.util.QMUIResHelper; + +import java.util.List; + + +public class QMUIBottomSheetGridLineLayout extends LinearLayout { + + private int maxItemCountInLines; + private int miniItemWidth = -1; + private List> mFirstLineViews; + private List> mSecondLineViews; + private int linePaddingHor; + private int itemWidth; + + public QMUIBottomSheetGridLineLayout(QMUIBottomSheet bottomSheet, + List> firstLineViews, + List> secondLineViews) { + super(bottomSheet.getContext()); + setOrientation(VERTICAL); + setGravity(Gravity.TOP); + int paddingVer = QMUIResHelper.getAttrDimen( + bottomSheet.getContext(), R.attr.qmui_bottom_sheet_grid_padding_vertical); + setPadding(0, paddingVer, 0, paddingVer); + mFirstLineViews = firstLineViews; + mSecondLineViews = secondLineViews; + maxItemCountInLines = Math.max( + firstLineViews != null ? firstLineViews.size() : 0, + secondLineViews != null ? secondLineViews.size() : 0); + linePaddingHor = QMUIResHelper.getAttrDimen( + bottomSheet.getContext(), R.attr.qmui_bottom_sheet_padding_hor); + + boolean hasFirstLine = false; + if (firstLineViews != null && !firstLineViews.isEmpty()) { + hasFirstLine = true; + HorizontalScrollView firstLine = createHorScroller(bottomSheet, firstLineViews); + addView(firstLine, new LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + } + + if (secondLineViews != null && !secondLineViews.isEmpty()) { + HorizontalScrollView secondLine = createHorScroller(bottomSheet, secondLineViews); + LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + if (hasFirstLine) { + lp.topMargin = QMUIResHelper.getAttrDimen( + bottomSheet.getContext(), R.attr.qmui_bottom_sheet_grid_line_vertical_space); + } + addView(secondLine, lp); + } + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int measureWidth = MeasureSpec.getSize(widthMeasureSpec); + itemWidth = calculateItemWidth( + measureWidth, maxItemCountInLines, linePaddingHor, linePaddingHor); + if (mFirstLineViews != null) { + for (Pair pair : mFirstLineViews) { + if (pair.second.width != itemWidth) { + pair.second.width = itemWidth; + } + } + } + + if (mSecondLineViews != null) { + for (Pair pair : mSecondLineViews) { + if (pair.second.width != itemWidth) { + pair.second.width = itemWidth; + } + } + } + + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + + protected HorizontalScrollView createHorScroller( + QMUIBottomSheet bottomSheet, + List> itemViews) { + Context context = bottomSheet.getContext(); + HorizontalScrollView scroller = new HorizontalScrollView(context); + scroller.setHorizontalScrollBarEnabled(false); + scroller.setClipToPadding(true); + + LinearLayout linear = new LinearLayout(context); + linear.setOrientation(LinearLayout.HORIZONTAL); + linear.setGravity(Gravity.CENTER_VERTICAL); + linear.setPadding(linePaddingHor, 0, linePaddingHor, 0); + scroller.addView(linear, new HorizontalScrollView.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + + for (int i = 0; i < itemViews.size(); i++) { + Pair pair = itemViews.get(i); + linear.addView(pair.first, pair.second); + } + + return scroller; + } + + + @Override + protected void measureChild(View child, int parentWidthMeasureSpec, int parentHeightMeasureSpec) { + super.measureChild(child, parentWidthMeasureSpec, parentHeightMeasureSpec); + } + + + private int calculateItemWidth(int width, int calculateCount, int paddingLeft, int paddingRight) { + if (miniItemWidth == -1) { + miniItemWidth = QMUIResHelper.getAttrDimen(getContext(), R.attr.qmui_bottom_sheet_grid_item_mini_width); + } + + final int parentSpacing = width - paddingLeft - paddingRight; + int itemWidth = miniItemWidth; + // there is no more space for the last one item. then stretch the item width + if (calculateCount >= 3 + && parentSpacing - calculateCount * itemWidth > 0 + && parentSpacing - calculateCount * itemWidth < itemWidth) { + int count = parentSpacing / itemWidth; + itemWidth = parentSpacing / count; + } + // if there are more items. then show half of the first that is exceeded + // to tell user that there are more. + if (itemWidth * calculateCount > parentSpacing) { + int count = (width - paddingLeft) / itemWidth; + itemWidth = (int) ((width - paddingLeft) / (count + .5f)); + } + return itemWidth; + } +} diff --git a/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheetItemView.java b/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheetItemView.java deleted file mode 100644 index 83d46bb9a..000000000 --- a/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheetItemView.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * 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 androidx.appcompat.widget.AppCompatImageView; -import android.util.AttributeSet; -import android.view.ViewStub; -import android.widget.TextView; - -import com.qmuiteam.qmui.R; -import com.qmuiteam.qmui.alpha.QMUIAlphaLinearLayout; - -/** - * QMUIBottomSheet 的ItemView - * @author zander - * @date 2017-12-05 - */ -public class QMUIBottomSheetItemView extends QMUIAlphaLinearLayout { - - private AppCompatImageView mAppCompatImageView; - private ViewStub mSubScript; - private TextView mTextView; - - - public QMUIBottomSheetItemView(Context context) { - super(context); - } - - public QMUIBottomSheetItemView(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public QMUIBottomSheetItemView(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - } - - @Override - protected void onFinishInflate() { - super.onFinishInflate(); - mAppCompatImageView = (AppCompatImageView) findViewById(R.id.grid_item_image); - mSubScript = (ViewStub) findViewById(R.id.grid_item_subscript); - mTextView = (TextView) findViewById(R.id.grid_item_title); - } - - public AppCompatImageView getAppCompatImageView() { - return mAppCompatImageView; - } - - public TextView getTextView() { - return mTextView; - } - - public ViewStub getSubScript() { - return mSubScript; - } -} diff --git a/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheetListAdapter.java b/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheetListAdapter.java index 280f9b065..70d3150c5 100644 --- a/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheetListAdapter.java +++ b/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheetListAdapter.java @@ -36,7 +36,7 @@ public class QMUIBottomSheetListAdapter extends RecyclerView.Adapter mData = new ArrayList<>(); + private List mData = new ArrayList<>(); private final boolean mNeedMark; private final boolean mGravityCenter; private int mCheckedIndex = -1; @@ -58,7 +58,7 @@ public void setOnItemClickListener(OnItemClickListener onItemClickListener) { public void setData(@Nullable View headerView, @Nullable View footerView, - List data) { + List data) { mHeaderView = headerView; mFooterView = footerView; mData.clear(); @@ -114,7 +114,7 @@ public void onBindViewHolder(@NonNull VH holder, int position) { if(mHeaderView != null){ position--; } - QMUIBottomSheetItemModel itemModel = mData.get(position); + QMUIBottomSheetListItemModel itemModel = mData.get(position); QMUIBottomSheetListItemView itemView = (QMUIBottomSheetListItemView) holder.itemView; itemView.render(itemModel, position == mCheckedIndex); } @@ -132,6 +132,6 @@ public VH(@NonNull View itemView) { } interface OnItemClickListener { - void onClick(VH vh, int dataPos, QMUIBottomSheetItemModel model); + void onClick(VH vh, int dataPos, QMUIBottomSheetListItemModel model); } } diff --git a/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheetItemModel.java b/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheetListItemModel.java similarity index 65% rename from qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheetItemModel.java rename to qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheetListItemModel.java index 2a1822cce..5eda7ac66 100644 --- a/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheetItemModel.java +++ b/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheetListItemModel.java @@ -16,56 +16,63 @@ package com.qmuiteam.qmui.widget.dialog; +import android.graphics.Typeface; import android.graphics.drawable.Drawable; -public class QMUIBottomSheetItemModel { +public class QMUIBottomSheetListItemModel { Drawable image = null; int imageRes = 0; int imageSkinTintColorAttr = 0; int imageSkinSrcAttr = 0; int textSkinColorAttr = 0; - String text; + CharSequence text; String tag = ""; boolean hasRedPoint = false; boolean isDisabled = false; + Typeface typeface; - public QMUIBottomSheetItemModel(String text, String tag) { + public QMUIBottomSheetListItemModel(CharSequence text, String tag) { this.text = text; this.tag = tag; } - public QMUIBottomSheetItemModel image(Drawable image) { + public QMUIBottomSheetListItemModel image(Drawable image) { this.image = image; return this; } - public QMUIBottomSheetItemModel image(int imageRes) { + public QMUIBottomSheetListItemModel image(int imageRes) { this.imageRes = imageRes; return this; } - public QMUIBottomSheetItemModel skinTextColorAttr(int attr) { + public QMUIBottomSheetListItemModel skinTextColorAttr(int attr) { this.textSkinColorAttr = attr; return this; } - public QMUIBottomSheetItemModel skinImageTintColorAttr(int attr) { + public QMUIBottomSheetListItemModel skinImageTintColorAttr(int attr) { this.imageSkinTintColorAttr = attr; return this; } - public QMUIBottomSheetItemModel skinImageSrcAttr(int attr) { + public QMUIBottomSheetListItemModel skinImageSrcAttr(int attr) { this.imageSkinSrcAttr = attr; return this; } - public QMUIBottomSheetItemModel redPoint(boolean hasRedPoint) { + public QMUIBottomSheetListItemModel redPoint(boolean hasRedPoint) { this.hasRedPoint = hasRedPoint; return this; } - public QMUIBottomSheetItemModel disabled(boolean isDisabled) { + public QMUIBottomSheetListItemModel disabled(boolean isDisabled) { this.isDisabled = isDisabled; return this; } + + public QMUIBottomSheetListItemModel typeface(Typeface typeface){ + this.typeface = typeface; + return this; + } } diff --git a/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheetListItemView.java b/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheetListItemView.java index f700867b0..4733526f6 100644 --- a/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheetListItemView.java +++ b/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheetListItemView.java @@ -145,7 +145,7 @@ public QMUIBottomSheetListItemView(Context context, boolean markStyle, boolean g mItemHeight = QMUIResHelper.getAttrDimen(context, R.attr.qmui_bottom_sheet_list_item_height); } - public void render(@NonNull QMUIBottomSheetItemModel itemModel, boolean isChekced){ + public void render(@NonNull QMUIBottomSheetListItemModel itemModel, boolean isChecked){ QMUISkinValueBuilder builder = QMUISkinValueBuilder.acquire(); if(itemModel.imageSkinSrcAttr != 0){ builder.src(itemModel.imageSkinSrcAttr); @@ -175,6 +175,9 @@ public void render(@NonNull QMUIBottomSheetItemModel itemModel, boolean isChekce QMUISkinManager.defaultInstance(getContext()).refreshTheme(mIconView); mTextView.setText(itemModel.text); + if(itemModel.typeface != null){ + mTextView.setTypeface(itemModel.typeface); + } if(itemModel.textSkinColorAttr != 0){ builder.textColor(itemModel.textSkinColorAttr); QMUISkinHelper.setSkinValue(mTextView, builder); @@ -186,7 +189,7 @@ public void render(@NonNull QMUIBottomSheetItemModel itemModel, boolean isChekce mRedPointView.setVisibility(itemModel.hasRedPoint ? View.VISIBLE : View.GONE); if(mMarkView != null){ - mMarkView.setVisibility(isChekced ? View.VISIBLE : View.INVISIBLE); + mMarkView.setVisibility(isChecked ? View.VISIBLE : View.INVISIBLE); } } diff --git a/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheetRootLayout.java b/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheetRootLayout.java index 5f6b19052..96ec3594b 100644 --- a/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheetRootLayout.java +++ b/qmui/src/main/java/com/qmuiteam/qmui/widget/dialog/QMUIBottomSheetRootLayout.java @@ -29,6 +29,7 @@ public class QMUIBottomSheetRootLayout extends QMUILinearLayout { private final int mUsePercentMinHeight; private final float mHeightPercent; + private final int mMaxWidth; public QMUIBottomSheetRootLayout(Context context) { this(context, null); @@ -49,10 +50,16 @@ public QMUIBottomSheetRootLayout(Context context, AttributeSet attrs) { } mUsePercentMinHeight = QMUIResHelper.getAttrDimen(context, R.attr.qmui_bottom_sheet_use_percent_min_height); mHeightPercent = QMUIResHelper.getAttrFloatValue(context, R.attr.qmui_bottom_sheet_height_percent); + mMaxWidth = QMUIResHelper.getAttrDimen(context, R.attr.qmui_bottom_sheet_max_width); } @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); + } int heightSize = MeasureSpec.getSize(heightMeasureSpec); if (heightSize >= mUsePercentMinHeight) { heightMeasureSpec = MeasureSpec.makeMeasureSpec( diff --git a/qmui/src/main/res/layout/qmui_bottom_sheet_grid.xml b/qmui/src/main/res/layout/qmui_bottom_sheet_grid.xml deleted file mode 100644 index f2fbb8b13..000000000 --- a/qmui/src/main/res/layout/qmui_bottom_sheet_grid.xml +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/qmui/src/main/res/layout/qmui_bottom_sheet_grid_item.xml b/qmui/src/main/res/layout/qmui_bottom_sheet_grid_item.xml deleted file mode 100644 index c02732c60..000000000 --- a/qmui/src/main/res/layout/qmui_bottom_sheet_grid_item.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/qmui/src/main/res/layout/qmui_bottom_sheet_grid_item_subscript.xml b/qmui/src/main/res/layout/qmui_bottom_sheet_grid_item_subscript.xml deleted file mode 100644 index 764462321..000000000 --- a/qmui/src/main/res/layout/qmui_bottom_sheet_grid_item_subscript.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - \ No newline at end of file diff --git a/qmui/src/main/res/layout/qmui_bottom_sheet_list_item_mark.xml b/qmui/src/main/res/layout/qmui_bottom_sheet_list_item_mark.xml deleted file mode 100644 index 9f98d95a3..000000000 --- a/qmui/src/main/res/layout/qmui_bottom_sheet_list_item_mark.xml +++ /dev/null @@ -1,25 +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 ab15f7440..e410054ed 100644 --- a/qmui/src/main/res/values/qmui_attrs_base.xml +++ b/qmui/src/main/res/values/qmui_attrs_base.xml @@ -273,6 +273,7 @@ + @@ -287,6 +288,7 @@ + @@ -295,33 +297,16 @@ + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - + \ 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 5e0a8d93b..09b7c3647 100644 --- a/qmui/src/main/res/values/qmui_style_widget.xml +++ b/qmui/src/main/res/values/qmui_style_widget.xml @@ -258,6 +258,8 @@ ?attr/qmui_skin_support_bottom_sheet_cancel_text_color 16sp center + ?attr/qmui_bottom_sheet_padding_hor + ?attr/qmui_bottom_sheet_padding_hor + +