Android编程自定义AlertDialog样式的方法详解

作者:迟做总比不做强 时间:2023-09-26 20:55:15 

本文实例讲述了Android编程自定义AlertDialog样式的方法。分享给大家供大家参考,具体如下:

开发的时候,通常我们要自定义AlertDialog来满足我们的功能需求:

比如弹出对话框中可以输入信息,或者要展示且有选择功能的列表,或者要实现特定的UI风格等。那么我们可以通过以下方式来实现。

方法一:完全自定义AlertDialog的layout.如我们要实现有输入框的AlertDialog布局custom_dialog.xml:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:background="@drawable/dialog_bg"
 android:orientation="vertical">
 <TextView
   android:id="@+id/title"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:background="#00ffff"
   android:gravity="center"
   android:padding="10dp"
   android:text="Dialog标题"
   android:textSize="18sp" />
 <EditText
   android:id="@+id/dialog_edit"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:hint="请输入内容"
   android:minLines="2"
   android:textScaleX="16sp" />
 <LinearLayout
   android:layout_width="match_parent"
   android:layout_height="40dp"
   android:orientation="horizontal">
   <Button
     android:id="@+id/btn_cancel"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:layout_weight="1"
     android:background="#00ffff"
     android:text="取消" />
   <View
     android:layout_width="1dp"
     android:layout_height="40dp"
     android:background="#D1D1D1"></View>
   <Button
     android:id="@+id/btn_comfirm"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:layout_weight="1"
     android:background="#00ffff"
     android:text="确定" />
 </LinearLayout>
</LinearLayout>

原来在代码中使用:


AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
View view = View
   .inflate(getActivity(), R.layout.custom_dialog, null);
builder.setView(view);
builder.setCancelable(true);
TextView title= (TextView) view
   .findViewById(R.id.title);//设置标题
EditText input_edt= (EditText) view
   .findViewById(R.id.dialog_edit);//输入内容
Button btn_cancel=(Button)view
.findViewById(R.id.btn_cancel);//取消按钮
Button btn_comfirm=(Button)view
.findViewById(R.id.btn_comfirm);//确定按钮
//取消或确定按钮监听事件处理
AlertDialog dialog = builder.create();
dialog.show();

这样,我们就可以弹出一个我们自定义的Dialog。这种方式有个弊端就是:

如果项目中有多个UI不同的AlertDialog,我们要写多个布局页面,当然可以提取通用布局,然后各种处理。

方法2:通过修改 Android 系统原生的 AlertDialog 中的控件来达到我们想要的效果。

比如我们要实现特定风格的对话框,我们可以写个公共的方法,通过修改 Android 系统原生的 AlertDialog 中的控件来达到我们想要的效果,简单代码如下:


public static void setCustomDialogStyle(AlertDialog dialog){
final Resources res = dialog.getContext().getResources();
   int topPanelId = res.getIdentifier("topPanel", "id", "android");//获取顶部
   LinearLayout topPanel = (LinearLayout) getDialog().findViewById(topPanelId);
   topPanel.setBackgroundResource(R.drawable.dialog_top_bg);//设置顶部背景
   LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, //设置顶部高度
       dp2px(getDialog().getContext(), 50));
   topPanel.setLayoutParams(params);
   int dividerId = res.getIdentifier("titleDivider", "id", "android");//设置分隔线
   View divider = getDialog().findViewById(dividerId);
   divider.setVisibility(View.GONE);
   int titleId = res.getIdentifier("alertTitle", "id", "android");//获取标题title
   TextView title = (TextView) getDialog().findViewById(titleId);//设置标题
   title.setTextColor(Color.WHITE);//标题文字颜色
   title.setTextSize(18);//文字大小
   title.setGravity(Gravity.CENTER);//文字位置
   int customPanelId = res.getIdentifier("customPanel", "id", "android");//设置内容
   FrameLayout customPanel = (FrameLayout) getDialog().findViewById(customPanelId);
   customPanel.setBackgroundColor(Color.TRANSPARENT);//背景透明
   customPanel.getChildAt(0).setBackgroundColor(Color.WHITE);
   customPanel.setPadding(dp2px(getContext(), 8), 0, ViewUtils.dp2px(getContext(), 8), 0);//设置padding
   int buttonPanelId = res.getIdentifier("buttonPanel", "id", "android");//获取底部
   LinearLayout buttonPanel = (LinearLayout) getDialog().findViewById(buttonPanelId);
   buttonPanel.setBackgroundResource(R.drawable.dialog_bottom_bg);//设置底部背景
   buttonPanel.setPadding(dp2px(getContext(), 8), 1, dp2px(getContext(), 8), 0);
   Button button1 = (Button) getDialog().findViewById(android.R.id.button1);//设置底部Button
   button1.setTextColor(Color.WHITE);//文字颜色
   button1.setTextSize(18);//文字大小
   button1.setBackgroundResource(R.drawable.bg_right_round);//Button圆形背景框
   Button button2 = (Button) getDialog().findViewById(android.R.id.button2);
   button2.setTextColor(Color.WHITE);
   button2.setTextSize(18);
   button2.setBackgroundResource(R.drawable.bg_left_round);
}

代码中用到的各种颜色,背景图片等根据需求自己定义。用到的dp与px转换代码如下:


public static int dp2px(Context context, float dp) {
   float density = context.getResources().getDisplayMetrics().density;
   return (int) (dp * density + 0.5f);
}

这样我们就统一定义好了AlertDialog的整个界风格,在使用的时候,只需要根据UI需求定义内容部分的UI即可。

还是上面可以输入的AlertDialog,我们的布局就可以只写成下面这个,当然,外面层的LinearLayout也是可以去掉的。


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_content"
 android:layout_height="wrap_content"
 android:orientation="vertical">
 <EditText
   android:id="@+id/input_edt"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:layout_margin="10dp"
   android:background="@drawable/input"
   android:hint="请输入内容"
   android:maxLength="16"
   android:textColor="#333333"
   android:textSize="16sp" />
</LinearLayout>

然后在代码中使用:


AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("设置标题");
View view = View
   .inflate(getActivity(), R.layout.custom_dialog, null);
builder.setView(view);
builder.setCancelable(true);
EditText input_edt= (QRCodeEditText) view
   .findViewById(R.id.input_edt);
builder.setPositiveButton(android.R.string.ok,
   new DialogInterface.OnClickListener() {
     @Override
     public void onClick(DialogInterface dialog, int which) {
       //点击确定按钮处理
         dialog.cancel();
       }
     }
   });
builder.setNegativeButton(android.R.string.cancel,
   new DialogInterface.OnClickListener() {
     @Override
     public void onClick(DialogInterface dialog, int which) {
     //点击取消按钮处理
       dialog.cancel();
     }
   });
final AlertDialog dialog = builder.create();
dialog.show();
setCustomDialogStyle(dialog);//这里不要忘记调用setCustomDialogStyle方法

这种方式 就比第一种方式方便 多了。当然要实现AlertDialog的背景透明等效果,我们还可以在res/value/style.xml内增加以下代码:


<style name="dialog" parent="@android:style/Theme.Dialog">
    <item name="android:windowFrame">@null</item> //Dialog的windowFrame框为无
    <item name="android:windowIsFloating">true</item> //是否浮现在activity之上
    <item name="android:windowIsTranslucent">true</item> //是否半透明
    <item name="android:windowNoTitle">true</item> //是否显示title
    <item name="android:background">@android:color/transparent</item> //设置dialog的背景
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:backgroundDimAmount">0.7</item> //就是用来控制灰度的值,当为1时,界面除了我们的dialog内容是高亮显示的,dialog以外的区域是黑色的,完全看不到其他内容
    <item name="android:backgroundDimEnabled">true</item>
</style>

在需要加入alertDialog的地方加入以下语句:


AlertDialog.Builder alertbBuilder=new AlertDialog.Builder(getActivity(),R.style.dialog);
//接下来代码.....

希望本文所述对大家Android程序设计有所帮助。

来源:http://blog.csdn.net/true100/article/details/52638508

标签:Android,AlertDialog样式
0
投稿

猜你喜欢

  • SpringBoot @ConfigurationProperties注解的简单使用

    2021-09-03 12:21:57
  • Java JVM运行时数据区(Run-Time Data Areas)

    2022-01-22 22:10:35
  • 一篇文章带你了解XGBoost算法

    2021-10-10 01:14:45
  • 不安装excel使用c#创建excel文件

    2023-02-20 07:03:25
  • C#使用虚拟方法实现多态

    2023-01-01 05:21:08
  • C#使用IComparer自定义List类实现排序的方法

    2021-06-28 04:28:09
  • Android事件冲突解决悬浮窗拖拽处理方案

    2023-12-17 01:51:17
  • 基于Hibernate中配置文件的学习(分享)

    2022-02-11 12:03:31
  • Java 使用Socket正确读取数据姿势

    2023-09-16 12:13:43
  • 简单总结C++中指针常量与常量指针的区别

    2022-06-28 17:33:12
  • 一文搞懂Java ScheduledExecutorService的使用

    2022-11-22 14:23:35
  • Java中初始化List集合的八种方式汇总

    2021-09-20 22:31:54
  • 简述Java图像倾斜方法及实例 <font color=red>原创</font>

    2023-08-16 09:38:47
  • C#快速排序算法实例分析

    2023-06-17 00:30:00
  • Android 百度地图定位实现仿钉钉签到打卡功能的完整代码

    2022-09-05 17:32:46
  • Android中RecyclerView上拉下拉,分割线,多条目的实例代码

    2022-10-14 06:05:07
  • struts+spring+hibernate三个框架的整合

    2022-08-08 08:13:15
  • Android读取手机通讯录联系人到自己项目

    2022-01-04 06:37:48
  • Java中JMM与volatile关键字的学习

    2022-03-24 00:12:00
  • 以Spring Boot的方式显示图片或下载文件到浏览器的示例代码

    2021-08-16 18:44:37
  • asp之家 软件编程 m.aspxhome.com