android 自定义dialog的实现方法

最近一直在做 java 相关的东西, 虽然一直在看 Android 但感觉有点留于理论,总这样毕竟不行,写的多不一定懂得多,但要想懂得多就一
定要写的多,于是今天动手写了一下 Dialog 有关的东西,算是对 Dialog 的一个整理吧。

AlertDialog 的使用就不说了,随便百度一下就能找到,这里要说的,主要就是自定义的 Dialog。

然后还是先上代码吧:

public class CustomDialog extends AlertDialog {

protected CustomDialog(Context context) {
super(context);
}

protected CustomDialog(Context context, boolean cancelable, OnCancelListener cancelListener) {
super(context, cancelable, cancelListener);
}

protected CustomDialog(Context context, @StyleRes int themeResId) {
super(context, themeResId);
}

public static class Builder {

private Context mContext;
private CustomDialog dialog;
private View layout;
private int mIcon = -1;
private String mText;
private String mContent;
private String mPoiBtn;
private View.OnClickListener mPoiListener;
private String mNegBtn;
private View.OnClickListener mNegListener;
private int animateType = -1;
public static final int LOW_DISAPPEAR_ANIMATION = 1;
public static final int ROTATE_DISAPPEAR_ANIMATION = 2;

public Builder(Context context) {
mContext = context;
dialog = new CustomDialog(context, R.style.Theme_AppCompat_Dialog_Alert);
layout = View.inflate(mContext, R.layout.custom_dialog1, null);

}

public Builder setTitleIcon(int iconRes) {
mIcon = iconRes;
return this;
}

public Builder setTitle(CharSequence text) {
mText = (String) text;
return this;
}

public Builder setContent(CharSequence text) {
mContent = (String) text;
return this;
}

public Builder setPositiveButton(CharSequence text, @NonNull View.OnClickListener
clickListener) {
mPoiBtn = (String) text;
mPoiListener = clickListener;
return this;
}

public Builder setNegativeButton(CharSequence text, @NonNull View.OnClickListener
clickListener) {
mNegBtn = (String) text;
mNegListener = clickListener;
return this;
}

public Builder create() {
ImageView titleIcon = (ImageView) layout.findViewById(R.id.title_icon);
TextView contentView = (TextView) layout.findViewById(R.id.custom_content);
TextView titleView = (TextView) layout.findViewById(R.id.title);
TextView poiBtn = (TextView) layout.findViewById(R.id.custom_confirm);
TextView negBtn = (TextView) layout.findViewById(R.id.custom_cancel);
poiBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
if (mIcon != -1) {
titleIcon.setImageBitmap(BitmapFactory.decodeResource(mContext.getResources(),
mIcon));
}

if (!TextUtils.isEmpty(mText)) {
titleView.setText(mText);
}

if (!TextUtils.isEmpty(mContent)) {
contentView.setText(mContent);
}

if (!TextUtils.isEmpty(mPoiBtn)) {
poiBtn.setText(mPoiBtn);
poiBtn.setOnClickListener(mPoiListener);
} else {
poiBtn.setVisibility(View.GONE);
}

if (!TextUtils.isEmpty(mNegBtn)) {
negBtn.setText(mNegBtn);
negBtn.setOnClickListener(mNegListener);
} else {
negBtn.setVisibility(View.GONE);
}

dialog.setCancelable(true);
dialog.setCanceledOnTouchOutside(true);
return this;
}
int i = 0;
public CustomDialog show(){
Window mWin = dialog.getWindow();
dialog.show();
dialog.setContentView(layout, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ActionBar.LayoutParams.WRAP_CONTENT));
switch (animateType){
case LOW_DISAPPEAR_ANIMATION:
mWin.setWindowAnimations(R.style.dialog_Low_appear_animation);
break;
case ROTATE_DISAPPEAR_ANIMATION:
mWin.setWindowAnimations(R.style.dialog_rotate_appear_animation);
break;
}

return dialog;
}

public Builder setDisappearAnimator(int animateType){
this.animateType = animateType;
return this;
}

}
}

代码算不上多,做个分类的话,主要是有 3 部分: Builder 的构建,内容的设置,Dilalog的显示

首先说一下 Builder 的构建, 构建方法主要完成了 2 个功能, CustomDialog 的实例化 和 布局的填充,这里需要注意的有一点,不要急着吧
填充的布局添加到 dialog 实例中去, 在 dialog 的 show 方法之前调用 setContentView 或是 addContentView ,这样都会导致报错 RequestFeature must be called before adding content;

内容设置的代码,主要就是采用了一种链式的设计方法,每个方法都可以返回 Builder 类本身, 这样就可以一条直线的调用方法了,这样写起来 比较简洁;

最后,就是 dialog 的显示了, 记住在 show 之后调用 setContentView 或是 addContentView 就可以了, 置于 setCancelable() 和 setCancelableOnTouchOutside() 这个是对 dialog 消失时的设置,主要就两个 boolean 值,可以自己看一下;

下面是 R.layout.custom_dialog1 的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/shape_custom_bg_grey">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center">
<ImageView
android:id="@+id/title_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="这里放置默认的标题"
android:textSize="20sp"/>
</LinearLayout>
<TextView
android:id="@+id/custom_content"
android:layout_width="match_parent"
android:layout_height="120dp"
android:padding="10dp"
android:text="这里可以放置正文内容"
android:textAlignment="center"
android:textSize="16sp"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp">
<TextView
android:id="@+id/custom_cancel"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="取消"
android:textSize="18sp"
android:gravity="center"
android:background="@color/cancelBtn"
/>
<TextView
android:id="@+id/custom_confirm"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="确定"
android:textSize="18sp"
android:gravity="center"
android:background="@color/confirmBtn"
/>
</LinearLayout>

</LinearLayout>

最最后, 补充一下 Dialog 的入场动画和出场动画的定义方法

Dialog 主要是依附于一个 Window 对象来进行显示隐藏的,Window 对象的获取可以通过 dialog.getWindow 获得, 所以,dialog的出入场 动画其实就是 Window 的出入场动画,那么就简单了,通过 xml 来定义;

首先是 res/values/style.xml 文件

<style name="dialog_Low_appear_animation" parent="android:Animation">
<item name="android:windowEnterAnimation">@anim/dialog_low_enter_animation</item>
<item name="android:windowExitAnimation">@anim/dialog_low_exit_animation</item>
</style>

然后,显然后是 res/anim 下新建 dialog_low_enter_animation 和 dialog_low_exit_animation 的 Resource 文件;

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="0" android:toXDelta="0" android:fromYDelta="100%" android:toYDelta="0"
android:duration="500"/>
<alpha android:fromAlpha="0" android:toAlpha="1" android:duration="500"/>

</set>

入场和出场的参数自己看着怎么定义合适,也就不多说了。

附上使用方法

CustomDialog dialog = new CustomDialog.Builer().setTitle("").setContent("")
.setPositiveButton("确定", new View.OnclickListerner(){
@override
public void onClick(View view){
dialog.dismiss();
}
})
.setNegativeButton("取消", new View.OnClickListener(){
@override
public void onClick(View view){
dialog.dismiss();
}
})
.setDisappearAnimation(CustomDialog.Builder.LOW_DISAPPEAR_ANIMATION)
.creat().show();

写到这里,好吧,dialog 的用法基本就写完了,关于原理方面的东西现在还没有涉及,以后涉猎了再来接着补充。

时间: 2024-10-18 08:42:23

android 自定义dialog的实现方法的相关文章

问题解决之Android自定义Dialog无法dismiss

场景: 点击ListView的一个Item,弹出自定义Dialog.在初始化Dialog时,将一个OnClickListener作为参数传递给Dialog.点击布局中设置的Button可以dismiss. 问题: Dialog布局中的两个Button设置了监听但事件没有触发到. 分析: 1.Button确实添加了OnClickListener事件,但没有被触发,有可能是点击的Button和注册监听的Button不是同一个对象,所以点击没有dismiss. 给出自定义Dialog代码和界面调用的代

Android自定义Dialog简单实例

做Android应用中,最缺少不了的就是自定义Dialog,对于系统默认提供的Dialog样式,一般都不复合我们应用的样式. 自定义Dialog需要3步骤即可: 1.主要的重写Dialog的Java类 2.清除Dialog Theme,在style.xml文件中加一个即可 3.使用方法 一.创建CustomPopDialog2.java类 package com.lenovocw.music.app.widget; import com.lenovocw.zhuhaizxt.R; import

android 自定义Dialog去除黑色边框

在自定义Dialog时显示的界面中老是有黑色的边框,下面就介绍使用style去除黑色边框方法. 首先在values/styles定义自定义样式: <style name="MyDialog" parent="@android:Theme.Dialog"> <item name="android:windowFrame">@null</item> <item name="android:windo

android 自定义dialog并实现失去焦点(背景透明)的功能

前言:由于在项目中需要用到更新显示动画的需求,所以想到了dialog,自定义dialog不难,网上教程很多,但是在实现dialog背景透明的需求时,遇到了一点问题,网上的一些方法在我的机器上并没有实现,只能曲折中找到了另一个方法实现.虽然有点麻烦,但毕竟效果不错. 此方法写在这里,一是和各位分享,二是做个记录,留待以后需求. 不说了,上代码: 下面是dialog自定义布局文件,是执行任务用的,参考即可. <?xml version="1.0" encoding="utf

Android自定义Dialog大小控制

Android应用开发中,无论是出于功能还是增加用户体验,弹出对话框(Dialog)进行一些操作提示是非常必要的.Android系统有自带的各种样式的对话框,但是根据项目需要可能从效果上满足不了需求,只时我们就要自定义对话框. 我们可以自定义Dialog的样式及展示布局,做出我们想要的对话框,但有的时候,我们做出的对话框要么显示太大,要么显得太小,或者是在不同的页面大小不一样,需要做个统一!此时我们就需要对Dialog大小进行控制,今天就简单地讲下这个.贴出代码,注释中有详细说明. 先是我们自定

Android自定义View的实现方法,带你一步步深入了解View(四)

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17357967 不 知不觉中,带你一步步深入了解View系列的文章已经写到第四篇了,回顾一下,我们一共学习了LayoutInflater的原理分析.视图的绘制流程. 视图的状态及重绘等知识,算是把View中很多重要的知识点都涉及到了.如果你还没有看过我前面的几篇文章,建议先去阅读一下,多了解一些原理方面的东 西. 之前我有承诺过,会在View这个话题上多写几篇博客,讲一讲View的

android自定义Dialog

效果图: 修改系统默认的Dialog. 1,修改样式,在style.xml中添加一下代码 <style name="DialogTheme" parent="@android:style/Theme.Dialog"> <item name="android:windowBackground">@android:color/transparent</item> <item name="androi

Android自定义dialog中的EditText无法弹出键盘的解决

最近我独立开发的项目<全医会>已经在内测当中了,很快将会上架到各大应用市场.之前开发的几个项目都因为一些原因没有上架还是比较遗憾的.所以,最近我心情格外的好. 今天在做一个新项目,专为律师和客户开发的APP,其中有一个自定义对话框的需求.这个知识点其实很简单,就是下图这个效果: 可是当我悠闲的写完以后才发现,自定义对话框里面嵌套的EditText根本无法获取焦点,无法弹出软键盘,郁闷,以前开发的软件里面没有EditText的时候一切正常,没有发现这个隐藏的坑.下图是我之前写的一个自定义对话框:

android 自定义Dialog背景透明及显示位置设置

先贴一下显示效果图,仅作参考: 代码如下: 1.自定义Dialog public class SelectDialog extends AlertDialog{ public SelectDialog(Context context, int theme) {    super(context, theme);} public SelectDialog(Context context) {    super(context);} @Overrideprotected void onCreate(