当前位置:   article > 正文

Android自定义Dialog对话框的三种方法

android自定义dialog

 

自定义对话框是经常使用的功能,我们常用的弹窗操作,除了使用popwindow(popupwindow的简单实用)就是使用dialog来实现,这两种组件都支持之定义布局和功能来满足我们个性化的需求,也可以不采用自定义而直接使用系统封装好的api来实现功能。今天简单总结下在使用dialog做弹窗功能的方法和会遇到的问题与解决方案

方法一:直接使用系统的,不自定义布局和功能方式,效果如下图:

点击事件中代码如下:

  1. AlertDialog.Builder dialog = new AlertDialog.Builder(GroupInfoActivity.this);
  2. dialog.setTitle("This is Dialog");
  3. dialog.setMessage("Something important");
  4. dialog.setCancelable(false);
  5. dialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
  6. @Override
  7. public void onClick(DialogInterface dialog, int which) {
  8. //自己的逻辑
  9. }
  10. });
  11. dialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
  12. @Override
  13. public void onClick(DialogInterface dialog, int which) {
  14. //自己的逻辑
  15. }
  16. });
  17. dialog.show();

方法二:效果如下图

代码如下:

    1,:自定义我们的dialog类如下所示  

  1. import android.app.Dialog;
  2. import android.content.Context;
  3. import android.os.Bundle;
  4. import android.support.annotation.NonNull;
  5. import android.support.annotation.Nullable;
  6. import android.text.TextUtils;
  7. import android.view.View;
  8. import android.widget.TextView;
  9. import com.im.R;
  10. /**
  11. * 公用的Dialog,提示用户的一些操作
  12. * Created by AndyYuan on 2018/12/26.
  13. */
  14. public class CommonDialog extends Dialog implements View.OnClickListener {
  15. private TextView contentTxt;
  16. private TextView titleTxt;
  17. private TextView submitTxt;
  18. private TextView cancelTxt;
  19. private Context mContext;
  20. private String content;
  21. private OncloseListener listener;
  22. private String positiveName;
  23. private String negativeName;
  24. private String title;
  25. public CommonDialog(@NonNull Context context) {
  26. super(context);
  27. this.mContext = context;
  28. }
  29. public CommonDialog(@NonNull Context context, int themeResId, String content) {
  30. super(context, themeResId);
  31. this.mContext = context;
  32. this.content = content;
  33. }
  34. public CommonDialog(@NonNull Context context, int themeResId, String content, OncloseListener listener) {
  35. super(context, themeResId);
  36. this.mContext = context;
  37. this.content = content;
  38. this.listener = listener;
  39. }
  40. protected CommonDialog(@NonNull Context context, boolean cancelable, @Nullable OnCancelListener cancelListener) {
  41. super(context, cancelable, cancelListener);
  42. this.mContext = context;
  43. }
  44. public CommonDialog setTitle(String title) {
  45. this.title = title;
  46. return this;
  47. }
  48. public CommonDialog setPositiveButton(String name) {
  49. this.positiveName = name;
  50. return this;
  51. }
  52. public CommonDialog setNegativeButton(String name) {
  53. this.negativeName = name;
  54. return this;
  55. }
  56. @Override
  57. protected void onCreate(Bundle savedInstanceState) {
  58. super.onCreate(savedInstanceState);
  59. setContentView(R.layout.dialog_common);
  60. setCanceledOnTouchOutside(false);
  61. initView();
  62. }
  63. private void initView() {
  64. contentTxt = (TextView) findViewById(R.id.content);
  65. titleTxt = (TextView) findViewById(R.id.title);
  66. submitTxt = (TextView) findViewById(R.id.submit);
  67. submitTxt.setOnClickListener(this);
  68. cancelTxt = (TextView) findViewById(R.id.cancel);
  69. cancelTxt.setOnClickListener(this);
  70. contentTxt.setText(content);
  71. if (!TextUtils.isEmpty(positiveName)) {
  72. submitTxt.setText(positiveName);
  73. }
  74. if (!TextUtils.isEmpty(negativeName)) {
  75. cancelTxt.setText(negativeName);
  76. }
  77. if (!TextUtils.isEmpty(title)) {
  78. titleTxt.setText(title);
  79. }
  80. }
  81. @Override
  82. public void onClick(View v) {
  83. switch (v.getId()) {
  84. case R.id.cancel:
  85. if (listener != null) {
  86. listener.onClick(false);
  87. }
  88. this.dismiss();
  89. break;
  90. case R.id.submit:
  91. if (listener != null) {
  92. listener.onClick(true);
  93. }
  94. this.dismiss();
  95. break;
  96. }
  97. }
  98. public interface OncloseListener {
  99. void onClick(boolean confirm);
  100. }
  101. }

2:定义公共的Dialog的布局:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:background="@drawable/bg_round_white"
  6. android:orientation="vertical">
  7. <TextView
  8. android:id="@+id/title"
  9. android:layout_width="match_parent"
  10. android:layout_height="wrap_content"
  11. android:layout_marginTop="12dp"
  12. android:gravity="center_horizontal"
  13. android:padding="12dp"
  14. android:text="这是dialog的标题"
  15. android:textColor="@color/black"
  16. android:textSize="14sp" />
  17. <TextView
  18. android:id="@+id/content"
  19. android:layout_width="match_parent"
  20. android:layout_height="wrap_content"
  21. android:layout_gravity="center_horizontal"
  22. android:layout_marginBottom="30dp"
  23. android:layout_marginLeft="40dp"
  24. android:layout_marginRight="40dp"
  25. android:layout_marginTop="20dp"
  26. android:gravity="center"
  27. android:lineSpacingExtra="3dp"
  28. android:text="这里是dialog中的内容"
  29. android:textSize="16sp" />
  30. <View
  31. android:layout_width="match_parent"
  32. android:layout_height="1dp"
  33. android:background="@color/light_gray" />
  34. <!--<LinearLayout-->
  35. <!--android:layout_width="match_parent"-->
  36. <!--android:layout_height="50dp"-->
  37. <!--android:orientation="horizontal">-->
  38. <!--<TextView-->
  39. <!--android:id="@+id/cancel"-->
  40. <!--android:layout_width="match_parent"-->
  41. <!--android:layout_height="match_parent"-->
  42. <!--android:layout_weight="1.0"-->
  43. <!--android:background="@drawable/bg_dialog_left_white"-->
  44. <!--android:gravity="center"-->
  45. <!--android:text="@string/cancel"-->
  46. <!--android:textSize="12sp" />-->
  47. <!--<View-->
  48. <!--android:layout_width="1dp"-->
  49. <!--android:layout_height="match_parent"-->
  50. <!--android:background="@color/gray" />-->
  51. <!--<TextView-->
  52. <!--android:id="@+id/submit"-->
  53. <!--android:layout_width="match_parent"-->
  54. <!--android:layout_height="match_parent"-->
  55. <!--android:layout_weight="1.0"-->
  56. <!--android:background="@drawable/bg_dialog_right_white"-->
  57. <!--android:gravity="center"-->
  58. <!--android:text="@string/ok"-->
  59. <!--android:textSize="12sp" />-->
  60. <!--</LinearLayout>-->
  61. <LinearLayout
  62. android:layout_width="match_parent"
  63. android:layout_height="51dp"
  64. android:gravity="center"
  65. android:orientation="horizontal">
  66. <TextView
  67. android:layout_width="0dp"
  68. android:layout_height="match_parent"
  69. android:layout_weight="2" />
  70. <TextView
  71. android:id="@+id/cancel"
  72. android:layout_width="0dp"
  73. android:layout_height="match_parent"
  74. android:layout_weight="1"
  75. android:gravity="center_vertical"
  76. android:text="取消"
  77. android:textColor="#999999" />
  78. <TextView
  79. android:id="@+id/submit"
  80. android:layout_width="0dp"
  81. android:layout_height="match_parent"
  82. android:layout_weight="1"
  83. android:gravity="center_vertical"
  84. android:text="确定"
  85. android:textColor="#E84242" />
  86. </LinearLayout>
  87. </LinearLayout>

3:在style里面定义我们自己的样式:

  

  1. <!--自定义的dialog的style设置-->
  2. <style name="commonDialog" parent="@android:style/Theme.Dialog">
  3. <item name="android:windowFrame">@null</item>
  4. <!--边框-->
  5. <item name="android:windowIsFloating">true</item>
  6. <!--是否浮现在activity之上-->
  7. <item name="android:windowIsTranslucent">false</item>
  8. <!--半透明-->
  9. <item name="android:windowNoTitle">true</item>
  10. <!--无标题-->
  11. <item name="android:windowBackground">@android:color/transparent</item>
  12. <!--背景透明-->
  13. <item name="android:backgroundDimEnabled">true</item>
  14. <!--模糊-->
  15. </style>

4:其中bg_round_white.xml文件如下:

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

5:调用方式很简单如下,我的是在一个点击事件里调用的如下代码:

  1. new CommonDialog(GroupInfoActivity.this, R.style.commonDialog, "确定删除群聊天记录?",
  2. confirm -> {
  3. if (confirm) {
  4. 这里都是自己的需要的逻辑操作......................
  5. Toast.makeText(GroupInfoActivity.this, "清空聊天记录成功", Toast.LENGTH_SHORT).show();
  6. }
  7. }).setTitle("提示").show();
方法三:采用自定义和功能方式效果也不错:
  1. //初始化并弹出对话框方法
  2. private void showDialog () {
  3. View view = LayoutInflater.from(this).inflate(R.layout.high_opinion_dialog_layout, null, false);
  4. final AlertDialog dialog = new AlertDialog.Builder(this).setView(view).create();
  5. Button btn_cancel_high_opion = view.findViewById(R.id.btn_cancel_high_opion);
  6. Button btn_agree_high_opion = view.findViewById(R.id.btn_agree_high_opion);
  7. btn_cancel_high_opion.setOnClickListener(new View.OnClickListener() {
  8. @Override
  9. public void onClick(View v) {
  10. SharedPreferencesUnitls.setParam(getApplicationContext(), "HighOpinion", "false");
  11. //... To-do
  12. dialog.dismiss();
  13. }
  14. });
  15. btn_agree_high_opion.setOnClickListener(new View.OnClickListener() {
  16. @Override
  17. public void onClick(View v) {
  18. //... To-do
  19. dialog.dismiss();
  20. }
  21. });
  22. dialog.show();
  23. //此处设置位置窗体大小,我这里设置为了手机屏幕宽度的3/4
  24. dialog.getWindow().setLayout((ScreenUtils.getScreenWidth(this) / 4 * 3), LinearLayout.LayoutParams.WRAP_CONTENT);
  25. }

其中ScreenUtils工具类如下所示:

  1. public class ScreenUtils {
  2. /**
  3. * 获取屏幕高度(px)
  4. */
  5. public static int getScreenHeight(Context context) {
  6. return context.getResources().getDisplayMetrics().heightPixels;
  7. }
  8. /**
  9. * 获取屏幕宽度(px)
  10. */
  11. public static int getScreenWidth(Context context) {
  12. return context.getResources().getDisplayMetrics().widthPixels;
  13. }
  14. }
 
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/318457?site
推荐阅读
相关标签
  

闽ICP备14008679号