服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - Android自定义底部弹出框ButtomDialog

Android自定义底部弹出框ButtomDialog

2022-11-09 15:34Android涛 Android

这篇文章主要为大家详细介绍了Android自定义底部弹出框ButtomDialog,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Android自定义底部弹出框的具体代码,供大家参考,具体内容如下

先看看效果和你要的是否一样

Android自定义底部弹出框ButtomDialog

一 、先来配置自定义控件需要的资源

1.在res文件夹下创建一个anim文件夹并创建两个slide_in_bottom.xml、slide_out_bottom.xml文件,负责弹框进出动画。

?
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
   android:shareInterpolator="false">
 <!-- slide_in_bottom.xml -->
 <translate
   android:duration="@integer/dp_300"
   android:fromXDelta="0%"
   android:toXDelta="0%"
   android:fromYDelta="100%"
   android:toYDelta="0%"/>
</set>
?
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
   android:shareInterpolator="false">
 <!-- slide_out_bottom.xml -->
 <translate
   android:duration="@integer/dp_300"
   android:fromXDelta="0%"
   android:toXDelta="0%"
   android:fromYDelta="0%"
   android:toYDelta="100%"/>
</set>

2.在style.xml添加阴影和动画样式。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<style name="Theme.Light.NoTitle.Dialog" parent="@android:style/Theme.Dialog">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowFrame">@null</item>
  </style>
 
  <style name="Theme.Light.NoTitle.NoShadow.Dialog" parent="Theme.Light.NoTitle.Dialog">
    <item name="android:backgroundDimEnabled">false</item>
  </style>
 
  <style name="Animation.Bottom.Rising" parent="@android:style/Animation">
    <item name="android:windowEnterAnimation">@anim/slide_in_bottom</item>
    <item name="android:windowExitAnimation">@anim/slide_out_bottom</item>
</style>

3.在drawable文件夹下创建一个title_background.xml文件,负责给文本内容添加背景。

?
1
2
3
4
5
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
  <corners android:radius="8dp"/>
  <solid android:color="#FFFFFFFF"/>
</shape>

二、自定义控件的布局

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:orientation="vertical"
       android:padding="12dp"
       >
 
  <LinearLayout
    android:background="@drawable/title_background"
    android:id="@+id/lay_container"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="8dp"
    android:orientation="vertical"/>
 
  <TextView
    android:id="@+id/btn_cancel"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/title_background"
    android:paddingBottom="8dip"
    android:paddingTop="8dip"
    android:text="取消"
    android:gravity="center"
    android:textColor="#007AFF"
    android:textSize="17sp"/>
 
</LinearLayout>

三、自定义控件类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
public class ButtomDialog extends Dialog {
 
  public ButtomDialog(Context context, int themeResId) {
    super(context, themeResId);
  }
 
  public static class Params {
    private final List<BottomMenu> menuList = new ArrayList<>();
    private View.OnClickListener cancelListener;
    private CharSequence menuTitle;
    private String cancelText;
    private Context context;
  }
 
  public static class Builder {
    private boolean canCancel = true;
    private boolean shadow = true;
    private final Params p;
 
    public Builder(Context context) {
      p = new Params();
      p.context = context;
    }
 
    public Builder setCanCancel(boolean canCancel) {
      this.canCancel = canCancel;
      return this;
    }
 
    public Builder setShadow(boolean shadow) {
      this.shadow = shadow;
      return this;
    }
 
    public Builder setTitle(CharSequence title) {
      this.p.menuTitle = title;
      return this;
    }
 
    public Builder addMenu(String text, View.OnClickListener listener) {
      BottomMenu bm = new BottomMenu(text, listener);
      this.p.menuList.add(bm);
      return this;
    }
 
    public Builder addMenu(int textId, View.OnClickListener listener) {
      return addMenu(p.context.getString(textId), listener);
    }
 
    public Builder setCancelListener(View.OnClickListener cancelListener) {
      p.cancelListener = cancelListener;
      return this;
    }
 
    public Builder setCancelText(int resId) {
      p.cancelText = p.context.getString(resId);
      return this;
    }
 
    public Builder setCancelText(String text) {
      p.cancelText = text;
      return this;
    }
 
    public ButtomDialog create() {
      final ButtomDialog dialog = new ButtomDialog(p.context, shadow ? R.style.Theme_Light_NoTitle_Dialog : R.style.Theme_Light_NoTitle_NoShadow_Dialog);
      Window window = dialog.getWindow();
      window.setWindowAnimations(R.style.Animation_Bottom_Rising);
      window.getDecorView().setPadding(0, 0, 0, 0);
      WindowManager.LayoutParams lp = window.getAttributes();
      lp.width = WindowManager.LayoutParams.MATCH_PARENT;
      lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
      window.setAttributes(lp);
      window.setGravity(Gravity.BOTTOM);
      View view = LayoutInflater.from(p.context).inflate(R.layout.dialog_bottom_menu, null);
      TextView btnCancel = (TextView) view.findViewById(R.id.btn_cancel);
      ViewGroup layContainer = (ViewGroup) view.findViewById(R.id.lay_container);
      ViewGroup.LayoutParams lpItem = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
      ViewGroup.MarginLayoutParams lpDivider = new ViewGroup.MarginLayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 1);
      lpDivider.setMargins(50,0,50,0);
      int dip1 = (int) (1 * p.context.getResources().getDisplayMetrics().density + 0.5f);
      int spacing = dip1 * 12;
      boolean hasTitle = !TextUtils.isEmpty(p.menuTitle);
      if (hasTitle) {
        //标题样式
        TextView tTitle = new TextView(p.context);
        tTitle.setLayoutParams(lpItem);
        tTitle.setGravity(Gravity.CENTER);
        tTitle.setTextColor(p.context.getResources().getColor(R.color.colorAccent));
        tTitle.setText(p.menuTitle);
        tTitle.setPadding(0, spacing, 0, spacing);
        //单独给标题设置背景样式
//        tTitle.setBackgroundResource(R.drawable.common_dialog_selection_selector_top);
        layContainer.addView(tTitle);
        View viewDivider = new View(p.context);
        viewDivider.setLayoutParams(lpDivider);
        viewDivider.setBackgroundColor(0xFFCED2D6);
        layContainer.addView(viewDivider);
      }
      //每一条的样式
      for (int i = 0; i < p.menuList.size(); i++) {
        BottomMenu bottomMenu = p.menuList.get(i);
        TextView bbm = new TextView(p.context);
        bbm.setLayoutParams(lpItem);
        bbm.setPadding(0, spacing, 0, spacing);
        bbm.setGravity(Gravity.CENTER);
        bbm.setText(bottomMenu.funName);
        bbm.setTextColor(0xFF007AFF);
        bbm.setTextSize(16);
        bbm.setOnClickListener(bottomMenu.listener);
        layContainer.addView(bbm);
        if (i != p.menuList.size() - 1) {
          View viewDivider = new View(p.context);
          viewDivider.setLayoutParams(lpDivider);
          viewDivider.setBackgroundColor(0xFFCED2D6);
          layContainer.addView(viewDivider);
        }
      }
 
      if (!TextUtils.isEmpty(p.cancelText)) {
        btnCancel.setText(p.cancelText);
      }
 
      if (p.cancelListener != null) {
        btnCancel.setOnClickListener(p.cancelListener);
      } else {
        btnCancel.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
            dialog.dismiss();
          }
        });
      }
 
      dialog.setContentView(view);
      dialog.setCanceledOnTouchOutside(canCancel);
      dialog.setCancelable(canCancel);
      return dialog;
    }
 
  }
 
  private static class BottomMenu {
    public String funName;
    public View.OnClickListener listener;
 
    public BottomMenu(String funName, View.OnClickListener listener) {
      this.funName = funName;
      this.listener = listener;
    }
  }
}

四、使用

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
 
  private Button mDialogCustom;
  private ButtomMenuDialog dialog;
 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initView();
  }
 
  private void initView() {
    mDialogCustom = (Button) findViewById(R.id.custom_dialog);
    mDialogCustom.setOnClickListener(this);
  }
 
  @Override
  public void onClick(View v) {
    switch (v.getId()) {
      case R.id.custom_dialog:
        ButtomMenuDialog.Builder builder = new ButtomMenuDialog.Builder(this);
        //添加条目,可多个
        builder.addMenu("相机", new View.OnClickListener() {
          @Override
          public void onClick(View view) {
            dialog.cancel();
            Toast.makeText(MainActivity.this, "相机", Toast.LENGTH_SHORT).show();
          }
        }).addMenu("相册", new View.OnClickListener() {
          @Override
          public void onClick(View view) {
            dialog.cancel();
            Toast.makeText(MainActivity.this, "相册", Toast.LENGTH_SHORT).show();
          }
        });
        //下面这些设置都可不写
        builder.setTitle("这是标题");//添加标题
        builder.setCanCancel(false);//点击阴影时是否取消dialog,true为取消
        builder.setShadow(true);//是否设置阴影背景,true为有阴影
        builder.setCancelText("取消");//设置最下面取消的文本内容
        //设置点击取消时的事件
        builder.setCancelListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
            dialog.cancel();
            Toast.makeText(MainActivity.this, "取消", Toast.LENGTH_SHORT).show();
          }
        });
        dialog = builder.create();
        dialog.show();
        break;
      default:
        break;
    }
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/qq_40441190/article/details/85280874

延伸 · 阅读

精彩推荐