自定义 Dialog (B)_dialog b-程序员宅基地

技术标签: android-view  

本文所用的知识点很简单,但很实用,非喜勿喷

目录

一、通过 AlertDialog ,快速使用自定义Dialog 。

二、自定义AlertDialog的宽度

三、DialogFragment 创建对话框

重点:AlertDialog 要在主线程才可以显示/隐藏。但DialogFragment可以在子线程中显示 /隐藏

正文:

一、通过 AlertDialog ,快速使用自定义Dialog 。

包含输入框。(等待框,普通的消息展示dialog道理相同。一般一个项目写三个通用的Dialog:等待框,普通的消息,包含输入框)

1、使用方法

MyDialogInputBuilder builder=new MyDialogInputBuilder(this);
//注意方法 setCancelable :alertDialog是否可以点击外围消失
builder.setTitle("title").setMessage("message").setCancelable(false);
builder.setPositiveButton("确认", new MyDialogInputBuilder.MyInputOnClickListener() {
    @Override
    public void onClick(DialogInterface dialog,String str) {
        //String str 的值为用户输入的值
        Log.w("test","PositiveButton onClick");
        Toast.makeText(LoginActivity.this,"点击了确认按钮 str="+str,Toast.LENGTH_SHORT).show();
        dialog.dismiss();
    }
});
builder.setNegativeButton("cancle", null);
alertDialog = builder.create();
alertDialog.show();

2、原码

public class MyDialogInputBuilder {
    private Context context;
    private String title;
    private String message;
    private String strPositive;
    private String strNegative;
    private MyInputOnClickListener positivelistener;
    private MyInputOnClickListener negativelistener;

    private boolean mCancelable = true;

    public MyDialogInputBuilder(Context context) {
        this.context=context;
        deleteDate();
    }
    private void deleteDate(){
        title=null;
        message=null;
        strPositive=null;
        strNegative=null;
        positivelistener=null;
        negativelistener=null;
    }
    public MyDialogInputBuilder setTitle(String title) {
        this.title = title;
        return this;
    }
    public MyDialogInputBuilder setMessage(String message) {
        this.message = message;
        return this;
    }

    /**
     * alertDialog是否可以点击外围消失
     * @param cancelable true 表示可以消失
     * @return
     */
    public MyDialogInputBuilder setCancelable(boolean cancelable) {
        this.mCancelable = cancelable;
        return this;
    }
    public MyDialogInputBuilder setPositiveButton(String text, MyInputOnClickListener listener) {
        this.strPositive = text;
        this.positivelistener = listener;
        return this;
    }
    public MyDialogInputBuilder setNegativeButton(String text, MyInputOnClickListener listener) {
        this.strNegative = text;
        this.negativelistener = listener;
        return this;
    }

    private EditText inputText;
    public AlertDialog create() {
        AlertDialog.Builder builder=new AlertDialog.Builder(this.context);
        View mView = LayoutInflater.from(this.context).inflate(R.layout.common_dialog_input, null);
        TextView tvTitle = (TextView)mView.findViewById(R.id.common_dialog_input_tips_titile);
        inputText = (EditText)mView.findViewById(R.id.common_dialog_input_tips_input);
        Button btnPositive =(Button) mView.findViewById(R.id.common_dialog_input_tips_btn_yes);
        Button btnNegative =(Button) mView.findViewById(R.id.common_dialog_input_tips_btn_no);
        if(isEmpty(title)){
            tvTitle.setVisibility(View.GONE);
        }else{
            tvTitle.setVisibility(View.VISIBLE);
            tvTitle.setText(title.trim());
        }
        if (isEmpty(strPositive)) {
            btnPositive.setVisibility(View.GONE);
        } else {
            btnPositive.setText(strPositive.trim());
        }
        if (isEmpty(strNegative)) {
            btnNegative.setVisibility(View.GONE);
        } else {
            btnNegative.setText(strNegative.trim());
        }
        inputText.setHint(message.trim());
        //tvMessage.setText(message.trim());
        builder.setView(mView).setCancelable(mCancelable);
        final AlertDialog dialog=builder.create();
        dialog.setCancelable(mCancelable);
        if (mCancelable) {
            dialog.setCanceledOnTouchOutside(true);
        }
        if(!isEmpty(strPositive) && positivelistener==null){
            btnPositive.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    dialog.dismiss();
                }
            });
        }else if(!isEmpty(strPositive) && positivelistener!=null){
            btnPositive.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    positivelistener.onClick(dialog,inputText.getText().toString());
                }
            });
        }
        if(!isEmpty(strNegative) && negativelistener==null){
            btnNegative.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    dialog.dismiss();
                }
            });
        }else if(!isEmpty(strNegative) && negativelistener!=null){
            btnNegative.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    negativelistener.onClick(dialog,inputText.getText().toString());
                }
            });
        }
        return dialog;
    }

    private  boolean isEmpty(String str){
        if (str==null || str.trim().equals("")){
            return true;
        }else{
            return false;
        }
    }

    public interface MyInputOnClickListener{
        void onClick(DialogInterface dialog,String inputStr);
    }
}

布局

<?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="match_parent"
    android:layout_gravity="center"
    android:background="@drawable/common_dialog_bg"
    android:orientation="vertical"
    >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_marginLeft="20dp"
        android:layout_marginTop="15dp"
        android:layout_marginBottom="10dp"
        android:gravity="center"
        >
        <ImageView
            android:id="@+id/common_dialog_input_tips_title_icon"
            android:layout_width="25dp"
            android:layout_height="25dp"
            android:src="@android:drawable/ic_dialog_info"
            />

        <TextView
            android:id="@+id/common_dialog_input_tips_titile"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:text="温馨提示"
            android:textColor="@android:color/white"
            android:textSize="18dp" />

    </LinearLayout>


    <TextView
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="@android:color/darker_gray" />

    <EditText
        android:id="@+id/common_dialog_input_tips_input"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:layout_marginTop="10dp"
        android:layout_marginRight="20dp"
        android:layout_marginBottom="10dp"
        android:gravity="left"
        android:textColor="@android:color/white"
        android:textSize="16dp"
        />
   

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="center"
        android:layout_marginBottom="10dp"
        android:layout_marginTop="10dp"
        android:layout_marginRight="20dp"
        android:layout_marginLeft="20dp"
        android:orientation="horizontal">

        <Button
            android:id="@+id/common_dialog_input_tips_btn_no"
            android:layout_width="0dp"
            android:layout_height="30dp"
            android:layout_marginRight="7dp"
            android:layout_weight="1"
            android:background="@android:color/holo_green_dark"
            android:gravity="center"
            android:text="否"
            android:textColor="@android:color/white" />


        <Button
            android:id="@+id/common_dialog_input_tips_btn_transfer"
            android:layout_width="0dp"
            android:layout_height="30dp"
            android:layout_weight="1"
            android:background="@android:color/holo_blue_dark"
            android:gravity="center"
            android:text="转移"
            android:textColor="@android:color/white"
            android:visibility="gone"
        />

        <Button
            android:id="@+id/common_dialog_input_tips_btn_yes"
            android:layout_width="0dp"
            android:layout_height="30dp"
            android:layout_marginLeft="7dip"
            android:layout_weight="1"
            android:background="@android:color/holo_red_dark"
            android:gravity="center"
            android:text="是"
            android:textColor="@android:color/white" />

        <!-- android:background="@android:color/holo_red_dark"-->

    </LinearLayout>


</LinearLayout>

 

二、自定义AlertDialog的宽度

1、方法1 alertDialog.getWindow().setAttributes(LayoutParams );

if (window != null) {
    window.getDecorView().setPadding(0, 0, 0, 0);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
        window.getDecorView().setBackground(context.getResources().getDrawable(res));
    }
   int width=0;
   if(context instanceof Activity){
       WindowManager manager = ((Activity)context).getWindowManager();
       Display defaultDisplay = manager.getDefaultDisplay();
       Point point = new Point();
       defaultDisplay.getSize(point);
       //int x = point.x;
       width=point.x * 5 / 6;
   }else{
       width= Tools.dipTopx(context,300);
   }
    android.view.WindowManager.LayoutParams lp = alertDialog.getWindow()
            .getAttributes();
    lp.gravity = Gravity.CENTER;
    lp.width = width;
    lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
    alertDialog.getWindow().setAttributes(lp);
    alertDialog.setCancelable(touchCancel);
    alertDialog.setCanceledOnTouchOutside(touchCancel);
    window.setWindowAnimations(R.style.alertDialogStyle01);
}

2、方法2 。

 dialog.getWindow().setLayout(DensityUtil.dip2px(context,300), LinearLayout.LayoutParams.WRAP_CONTENT);

DensityUtil.dip2px是dp转px的工具类

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/tantion/article/details/103822156

智能推荐

java es 搜索_使用elasticsearch从多个列表中搜索-程序员宅基地

文章浏览阅读1.3k次。我们有以下设置(简化/更改):MongoDB集合: ArticlesRedis列表: Today Yesterday This Week This Month我们经常收到新文章,并将它们放入适当的列表中(新文章进入'今天''本周'和'本月'[redis列表包含mongodb集合的id]) .这些列表可以包含很多项目(“本月”达到数百万) . 这些列表经常更改,文章消失并重新出现(业务逻辑) .这些..._elasticsearch search value in list

反激开关电源变压器设计实例讲解(定明芳)_反激变压器设计实例-程序员宅基地

文章浏览阅读2.8w次,点赞55次,收藏543次。内容来自《反激变压器的设计》(定明芳主讲)。定名芳老师主要讲了10步,最后应该还有一步,线径的选择已经绕制方式。这里进行了记录整理,把一些公式来源进行了推导。所有的设计都是基于理论计算。1.确定电源规格2.确定工作频率和最大占空比3.计算匝比(利用伏秒平衡原则)此处插入解释一下伏秒平衡,根源是磁通量平衡。该原则可以用来检查MOS管耐压是否够。4.计算初级线圈峰值电流基于CCM模式计算的。ip1是开关管要关闭时的峰值电流,ip2是开关管开始导通时的起始电流。因为时CCM模式,所以,ip_反激变压器设计实例

java奇偶排序算法_奇偶排序-程序员宅基地

文章浏览阅读871次。在《java高并发程序设计》一书中看到关于一种并行算法排序方法:奇偶排序。结合书上与网上的各项资料,在这里按自己的理解做下梳理。介绍冒泡排序:是串行算法,在每次迭代过程中,对于每个元素可能与前面元素交换,也可能和后面的元素交换,数据的相关性比较强很难直接改成并行算法。奇偶排序:或奇偶换位排序,或砖排序,是一种相对简单的排序算法,最初发明用于有本地互连的并行计算。这是与冒泡排序特点类似的一种比较排序..._奇偶排序算法的java

JAVA card 应用开发(四) Java Card CAP 文件组件分析_如何统合分析一张javacard-程序员宅基地

文章浏览阅读5.5k次。Java Card CAP 文件组件分析Java Card CAP 文件组件分析 00.1Java Card CAP 文件组件分析 01——Header Component.4Java Card CAP 文件组件分析 02——Directory Component.7Java Card CAP 文件组件分析 03——Applet Component.9Java _如何统合分析一张javacard

【网络安全】零基础入门网络安全劝退指北-程序员宅基地

文章浏览阅读696次,点赞11次,收藏17次。础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!**

nginx使用二级路径反向代理不同IP和端口_nginx 一个location 代理的同ip不同端口的同名服务-程序员宅基地

文章浏览阅读3.8k次。场景描述:通过二级目录(虚拟目录,应用程序)的方式访问同一ip+端口的不同应用,例如location是用户使用页面,location/admin/是管理页面,location部署在192.168.1.100的80端口,location/admin部署在172.20.1.32的8080端口上。解决方案:使用nginx反向代理,配置如下:server { listen 80; server_name demo.domain.com; #通过访问s_nginx 一个location 代理的同ip不同端口的同名服务

随便推点

html5图片无限循环播放,原生js实现无限循环轮播图效果-程序员宅基地

文章浏览阅读3.6k次。知识要点1.实现无限循环的原理:以偏移的距离来判断是否跳回第一张和最后一张也可以利用循环判断图片的当前索引值var newLeft=parseInt(list.style.left)+offset;//当前的偏移量+下一次的偏移量=新的偏移量list.style.left=newLeft+"px";//当前的偏移值=新的偏移值//以偏移的距离来判断是否跳回第一张和最后一张if(newLeft>..._html5图片循环滚动

win10更新KB5034441版本,报错0x80070643_kb5034441更新失败-程序员宅基地

文章浏览阅读567次,点赞23次,收藏20次。当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。网安所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。,一般来说恢复分区的前一个分区是系统分区,也即。我这里有星号(*),是GPT类型的。

高可用与负载均衡入门与实战(五)——配置nginx反向代理和负载均衡_5)配置容器nginx1的web服务,编辑首页内容为“nginx1”,在宿主机访问-程序员宅基地

文章浏览阅读758次。任务一、配置nginx反向代理,使用nginx1、APP1、APP2三个容器步骤1:使用php-apache镜像启动APP1和APP2两个容器1)创建docker网络docker network create --subnet=172.18.0.0/16 cluster2)查看宿主机上的docker网络类型种类docker network ls3)启动容器APP1,设定地址为17..._5)配置容器nginx1的web服务,编辑首页内容为“nginx1”,在宿主机访问

线程池参数——workQueue用法_线程池参数workqueue-程序员宅基地

文章浏览阅读1.5k次。线程池参数的 workQueue 决定了缓存任务的排队策略,对于不同的业务场景,我们可以使用不同的排队策略。我们只需要实现BlockingQueue 这个接口即可。介绍一下常用的有三种workQueue1. SynchronousQueue(阻塞队列)SynchronousQueue没有容量,是无缓冲等待队列,是一个不存储元素的阻塞队列,会直接将任务交给消费者(即丢给空闲的线程去执行),必须等队列中的添加元素被消费后才能继续添加新的元素,否则会走拒绝策略,所以使用SynchronousQueu_线程池参数workqueue

Golang Gin 路由组 RouterGroup 路由分类处理请求_go gin 路由分组-程序员宅基地

文章浏览阅读1.1k次。在前面已经学习了gin框架如何处理请求,解析请求,返回数据。在实际的项目当中,项目往往是以模块化来进行划分和开发的,所谓的模块化就是按照功能来划分,比如会有产品模块,会有用户模块,会将用户相关的进行统一的开发,放到用户模块当中,和产品相关的放在产品相关的模块当中,这样即方便开发者进行统一的开发也方便在系统的维护过程当中方便维护。_go gin 路由分组

python爬虫云南昆明二手房数据可视化大屏全屏系统设计与实现(django框架)-程序员宅基地

文章浏览阅读2.2k次,点赞10次,收藏7次。python爬虫云南昆明二手房数据可视化大屏全屏系统设计与实现(django框架),Python和Django作为成熟的开发语言和框架,拥有广泛的开发者社区和丰富的资源支持,能够满足本研究的开发需求。其次,随着房地产市场的不断发展,相关企业和决策者对于数据可视化的需求日益增强,因此本研究具有较高的经济价值和社会价值。然而,现有研究多集中在宏观层面的数据分析,针对特定地区(如云南昆明)的二手房市场数据可视化研究相对较少。项目的界面和功能都可以定制,包安装运行!