Java类
package com.meetdilse.store.ui.dialog;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.meetdilse.store.BaseApplication;
import com.meetdilse.store.R;
import com.meetdilse.store.interfaces.Action2;
import com.meetdilse.store.utils.DpUtil;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import androidx.annotation.NonNull;
import androidx.annotation.StringRes;
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
/**
* Created by WangChunHao on 2022/2/24 0024 15:55.
*
* 底部菜單彈窗
*/
public class BottomMenuDialog extends BottomSheetDialog {
private final List<String> mMenu;
private Action2<String, Integer> mOnItemClickListener;
public BottomMenuDialog(@NonNull Context context) {
super(context);
mMenu = new ArrayList<>();
}
//设置监听回调,传两个值回去,字和下标
public void setOnItemClickListener(Action2<String, Integer> action2) {
mOnItemClickListener = action2;
}
//调用这个方法往列表里面放值
public BottomMenuDialog setMenus(String... menus) {
mMenu.addAll(Arrays.asList(menus));
return this;
}
public BottomMenuDialog setMenus(@StringRes int... menus) {
for (int menu : menus) {
mMenu.add(BaseApplication.getContext().getString(menu));
}
return this;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_bottom_menu);
View dialogView = findViewById(R.id.dialog_view);
Button btnCancel = findViewById(R.id.btn_cancel);
//用这个,不然会有警告
if (dialogView == null) {
return;
}
//用动态布局的方式,且调用setMenus方法,那这个选择器就可以通用了
LinearLayout llMenuParent = dialogView.findViewById(R.id.ll_menu_parent);
llMenuParent.removeAllViews();
//从列表mMenu中取值然后settext
for (int i = 0; i < mMenu.size(); i++) {
final int position = i;//适配器回调的数据要用final,不可改变
TextView tvMenu = new TextView(getContext());
tvMenu.setText(mMenu.get(position));
tvMenu.setMinHeight(DpUtil.dp2px(55));
tvMenu.setTextSize(16);
tvMenu.setTextColor(Color.parseColor("#FF000000"));
tvMenu.setGravity(Gravity.CENTER);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT);
llMenuParent.addView(tvMenu,lp);
//设置监听回调
tvMenu.setOnClickListener(v -> {
dismiss();
if (mOnItemClickListener != null) {
mOnItemClickListener.onAction(mMenu.get(position),position);
}
});
}
//取消按键
Objects.requireNonNull(btnCancel).setOnClickListener(v -> dismiss());
}
//下面是设置布局为最大
private boolean mSetLayoutTag;
@Override
protected void onStart() {
super.onStart();
if (mSetLayoutTag) {
return;
}
try {
getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
mSetLayoutTag = true;
} catch (Exception e) {
mSetLayoutTag = true;
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:id="@+id/dialog_view"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:id="@+id/ll_menu_parent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:minHeight="55dp"
android:orientation="vertical" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#EDEDED" />
<com.github.widget.SuperButton
android:id="@+id/btn_cancel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="55dp"
android:text="@string/cancel"
android:textColor="@color/black"
android:textSize="16sp" />
</LinearLayout>
还有另外一种
package com.meetdilse.store.ui.dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;
import com.meetdilse.store.R;
import com.meetdilse.store.interfaces.Action1;
import com.meetdilse.store.view.SuperNumberPicker;
import java.util.ArrayList;
import java.util.List;
import androidx.annotation.StringRes;
import androidx.appcompat.app.AppCompatDialog;
/**
* Created by ZhongXiaolong on 2022/02/23 10:31.
* <p>
* 身高选择器
*/
public class HeightPickerDialog extends AppCompatDialog {
private String mTitle;
private TextView mTvTitle;
private int mSelectHeight;
private SuperNumberPicker mNpHeight;
private List<Integer> mHeights;
private Action1<Integer> mOnHeightPickerCallback;
public HeightPickerDialog(Context context) {
super(context, R.style.Theme_Design_BottomSheetDialog);
}
/**
* 设置回调监听
*/
public HeightPickerDialog setOnHeightPickerCallback(Action1<Integer> action) {
mOnHeightPickerCallback = action;
return this;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.dialog_height_picker);
View dialogView = findViewById(R.id.dialog_view);
if (dialogView == null) {
return;
}
mTvTitle = dialogView.findViewById(R.id.tv_title);
mNpHeight = dialogView.findViewById(R.id.np_height);
mHeights = new ArrayList<>();
List<String> displayedValues = new ArrayList<>();
for (int i = 150; i <= 178; i++) {
displayedValues.add(i + " cm ");
mHeights.add(i);
}
mNpHeight.setDisplayedValues(displayedValues.toArray(new String[]{}));
mNpHeight.setMinValue(0);
mNpHeight.setMaxValue(displayedValues.size() - 1);
setSelectHeight(mSelectHeight);
mTvTitle.setText(mTitle);
dialogView.findViewById(R.id.btn_cancel).setOnClickListener(v -> dismiss());
dialogView.findViewById(R.id.btn_confirm).setOnClickListener(v -> {
if (mOnHeightPickerCallback != null) {
mOnHeightPickerCallback.onAction(mHeights.get(mNpHeight.getValue()));
}
dismiss();
});
}
/**
* 设置选中的身高
*
* @param height 选中的身高
*/
public HeightPickerDialog setSelectHeight(int height) {
mSelectHeight = height;
if (mNpHeight != null) {
int position = mHeights.indexOf(height);
if (position > 0) {
mNpHeight.setValue(position);
} else {
mNpHeight.setValue(10);
}
}
return this;
}
/**
* 设置标题
*/
public HeightPickerDialog setDialogTitle(String title) {
mTitle = title;
if (mTvTitle != null) {
mTvTitle.setText(mTitle);
}
return this;
}
/**
* 设置标题
*/
public HeightPickerDialog setDialogTitle(@StringRes int titleId) {
return setDialogTitle(getContext().getString(titleId));
}
private boolean mSetAttrTag;
@Override
protected void onStart() {
super.onStart();
if (!mSetAttrTag) {
mSetAttrTag = true;
WindowManager.LayoutParams attributes = getWindow().getAttributes();
attributes.gravity = Gravity.BOTTOM;
attributes.width = ViewGroup.LayoutParams.MATCH_PARENT;
getWindow().setAttributes(attributes);
}
}
}