最终效果:
特点描述:
1.弹窗圆角
2.列表多选
3.ratingbar可拖动
一。带圆角的alertDialog
alertDialog的使用有三种:一种是自定义Dialog 继承 AlertDialog;一种是在使用的地方直接创建AlertDialog;一种是用工厂方法,创建自己的Dialog类,然后在构造方法内创建AlertDialog
第一种:继承的方式
public class BottomDialog extends Dialog implements View.OnClickListener{
}
- 重写onCreate方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.view_bottom_dialog);
在oncreate方法中setContentView入自己的自定义布局
使用的时候创建即可
二。自定义Dialog不继承
使用工厂模式
public class AlertDialog{
...
public AlertDialog(Context context ,View view){
this.context = context;
WindowManager windowManager = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
display = windowManager.getDefaultDisplay();
this.mView = view;
}
public AlertDialog builder() {
View view = LayoutInflater.from(context).inflate(
R.layout.view_alertdialog, null);
// 获取自定义Dialog布局中的控件
...
// 定义Dialog布局和参数
dialog = new Dialog(context, R.style.MyDialog);
dialog.setContentView(view);
if (mView != null ){
setLoaction();
} else {
if (MyApplication.isPad){
lLayout_bg.setLayoutParams(new FrameLayout.LayoutParams((int) (display
.getWidth() * 0.3), LayoutParams.WRAP_CONTENT));
}else {
lLayout_bg.setLayoutParams(new FrameLayout.LayoutParams((int) (Math.min(display
.getWidth(),display.getHeight()) * 0.85), LayoutParams.WRAP_CONTENT));
}
}
return this;
}
三。直接使用(本需求的弹窗就用这种模式吧)
private int selectNum = 0;
private void showChoosePlayModeDialog(MusicListData musicListData,View view) {
AlertDialog.Builder dialogBuider = new AlertDialog.Builder(getContext(),R.style.myAlertDialog);
View inflate = LayoutInflater.from(getContext()).inflate(R.layout.dialog_choose_play_mode, null);
dialogBuider.setView(inflate);
CheckBox gp = inflate.findViewById(R.id.type_gp);
CheckBox gq = inflate.findViewById(R.id.type_gq);
CheckBox jz= inflate.findViewById(R.id.type_jz);
CheckBox zy = inflate.findViewById(R.id.type_zy);
final RatingBar ratingBar1 = inflate.findViewById(R.id.ratingBar_1);
final RatingBar ratingBar2 = inflate.findViewById(R.id.ratingBar_2);
final RatingBar ratingBar3 = inflate.findViewById(R.id.ratingBar_3);
final RatingBar ratingBar4 = inflate.findViewById(R.id.ratingBar_4);
final ImageView img1 = inflate.findViewById(R.id.selectImg_1);
final ImageView img2 = inflate.findViewById(R.id.selectImg_2);
final ImageView img3 = inflate.findViewById(R.id.selectImg_3);
final ImageView img4 = inflate.findViewById(R.id.selectImg_4);
final TextView button = inflate.findViewById(R.id.btn);
ratingBar1.setVisibility(View.GONE);
ratingBar2.setVisibility(View.GONE);
ratingBar3.setVisibility(View.GONE);
ratingBar4.setVisibility(View.GONE);
img1.setVisibility(View.GONE);
img2.setVisibility(View.GONE);
img3.setVisibility(View.GONE);
img4.setVisibility(View.GONE);
button.setClickable(false);
selectNum = 0;
gp.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked){
selectNum++;
button.setClickable(true);
button.setTextColor(getContext().getResources().getColor(R.color.white));
button.setBackgroundColor(getContext().getResources().getColor(R.color.purple));
ratingBar1.setVisibility(View.VISIBLE);
img1.setVisibility(View.VISIBLE);
}else {
selectNum--;
if (selectNum==0){
button.setClickable(false);
button.setTextColor(getContext().getResources().getColor(R.color.gray_text));
button.setBackgroundColor(getContext().getResources().getColor(R.color.gray));
}
ratingBar1.setVisibility(View.GONE);
img1.setVisibility(View.GONE);
}
}
});
gq.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked){
selectNum++;
button.setClickable(true);
button.setTextColor(getContext().getResources().getColor(R.color.white));
button.setBackgroundColor(getContext().getResources().getColor(R.color.purple));
ratingBar4.setVisibility(View.VISIBLE);
img4.setVisibility(View.VISIBLE);
}else {
selectNum--;
if (selectNum==0){
button.setClickable(false);
button.setTextColor(getContext().getResources().getColor(R.color.gray_text));
button.setBackgroundColor(getContext().getResources().getColor(R.color.gray));
}
ratingBar4.setVisibility(View.GONE);
img4.setVisibility(View.GONE);
}
}
});
jz.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked){
selectNum++;
button.setClickable(true);
button.setTextColor(getContext().getResources().getColor(R.color.white));
button.setBackgroundColor(getContext().getResources().getColor(R.color.purple));
ratingBar2.setVisibility(View.VISIBLE);
img2.setVisibility(View.VISIBLE);
}else {
selectNum--;
if (selectNum==0){
button.setClickable(false);
button.setTextColor(getContext().getResources().getColor(R.color.gray_text));
button.setBackgroundColor(getContext().getResources().getColor(R.color.gray));
}
ratingBar2.setVisibility(View.GONE);
img2.setVisibility(View.GONE);
}
}
});
zy.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked){
selectNum++;
button.setClickable(true);
button.setTextColor(getContext().getResources().getColor(R.color.white));
button.setBackgroundColor(getContext().getResources().getColor(R.color.purple));
ratingBar3.setVisibility(View.VISIBLE);
img3.setVisibility(View.VISIBLE);
}else {
selectNum--;
if (selectNum==0){
button.setClickable(false);
button.setTextColor(getContext().getResources().getColor(R.color.gray_text));
button.setBackgroundColor(getContext().getResources().getColor(R.color.gray));
}
ratingBar3.setVisibility(View.GONE);
img3.setVisibility(View.GONE);
}
}
});
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
toLayoutWorkDetail();
}
});
AlertDialog dialog = dialogBuider.show();
Window dialogWindow = dialog.getWindow();
dialogWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
lp.width = 320;
lp.gravity = Gravity.CENTER;
dialogWindow.setAttributes(lp);
}
这里需要注意几个点:
1.设置弹窗大小:
必须是在show之后设置,否则无效
Window dialogWindow = dialog.getWindow();
dialogWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
lp.width = 320;
lp.gravity = Gravity.CENTER;
dialogWindow.setAttributes(lp);
其中
dialogWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
是设置弹窗透明的,不然无法实现圆角效果
布局xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="300dp"
android:layout_height="wrap_content"
android:gravity="center"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center"
android:background="@drawable/bg_corner">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center">
<ImageView
android:id="@+id/selectImg_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/select"/>
<CheckBox
android:id="@+id/type_gp"
android:text="跟谱模式"
style="@style/style_choose_play_mode_dialog_item" />
<RatingBar
android:id="@+id/ratingBar_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/xy_rating_bar_small"
android:rating="2"
android:isIndicator="false"
/>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/gray"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center">
<ImageView
android:id="@+id/selectImg_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/select"/>
<CheckBox
android:id="@+id/type_jz"
style="@style/style_choose_play_mode_dialog_item"
android:text="节奏模式"/>
<RatingBar
android:id="@+id/ratingBar_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/xy_rating_bar_small"
android:rating="2"
android:isIndicator="false"
/>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/gray"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center">
<ImageView
android:id="@+id/selectImg_3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/select"/>
<CheckBox
android:id="@+id/type_zy"
style="@style/style_choose_play_mode_dialog_item"
android:text="自由模式"/>
<RatingBar
android:id="@+id/ratingBar_3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/xy_rating_bar_small"
android:rating="2"
android:isIndicator="false"
/>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/gray"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center">
<ImageView
android:id="@+id/selectImg_4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/select"/>
<CheckBox
android:id="@+id/type_gq"
style="@style/style_choose_play_mode_dialog_item"
android:text="跟曲模式"/>
<RatingBar
android:id="@+id/ratingBar_4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/xy_rating_bar_small"
android:rating="2"
android:isIndicator="false"
/>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/gray"/>
<TextView
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="确认"
android:paddingLeft="40dp"
android:paddingRight="40dp"
android:layout_margin="20dp"
android:textColor="@color/gray_text"
android:background="@color/gray"/>
</LinearLayout>
其中几个注意点:
checkbox左边默认显示勾选框,想去掉的话
<item name="android:button">@null</item>
或者设置成自己定义的Drawbale文件
然后主要说下ratingbar的使用点
- 可拖动设置
android:isIndicator="false"
设为true不可拖动
- 修改图片
<style name="xy_rating_bar_small" parent="Base.Widget.AppCompat.RatingBar.Small">
<item name="android:minHeight">15dp</item>
<item name="android:maxHeight">15dp</item>
<item name="android:progressDrawable">@drawable/my_ratingbar_layerlist</item>
设置自己的style
然后在item里设置progressDrawable
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background" android:drawable="@mipmap/star_gray_bg"/>
<item android:id="@android:id/secondaryProgress" android:drawable="@mipmap/star_gray_bg"/>
<item android:id="@android:id/progress" android:drawable="@mipmap/star_yellow"/>
</layer-list>
最后贴下圆角背景
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="50dp" />
<gradient
android:angle="45"
android:endColor="@color/white"
android:startColor="@color/white" />
</shape>