常见对话框与自定义的的对话框

Android 专栏收录该内容
53 篇文章 0 订阅

                                              常见对话框与自定义的的对话框

在介绍自定义的对话框之前,我们先来介绍一下对话框的使用:常用对话框有四种,普通对话框、单选对话框、多选对话框、进度条对话框


下面举个例子假设有四个按钮,每个按钮对应一种对话框

普通对话框

  //1、点击按钮弹出普通对话框
public void click1(View v){

//通过builder构造器来构造
    AlertDialog.Builder builder=new Builder(this);
    builder.setTitle("警告!");
    builder.setMessage("世界最遥远的距离就是没有网络");
    builder.setPositiveButton("确定"new OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            System.out.println("点击了确定按钮");
        }
    });
    builder.setNegativeButton("取消"new OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            System.out.println("点击了取消按钮");
        }
    });
    builder.show();
}

单选对话框

//2、点击按钮弹出单选对话框
public void click2(View v){
    //通过builder构造器gouzao
    AlertDialog.Builder builder =new Builder(this);
    builder.setTitle("选择你喜欢的水果");
    final String items[]={"香蕉","西瓜","黄瓜","哈密瓜","苹果"};    
    //-1代表默认没有条目被选中
    builder.setSingleChoiceItems(items, -1, new OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            //把选择到的条目取出来
            String item=items[which];      
            Toast.makeText(getApplicationContext(), item, 1).show();
            //关闭对话框
            dialog.dismiss();
        }
    });
    //显示对话框
        builder.show();
}  

多选对话框

//多选对话框
public void click3(View v){
    //通过构造器构造
    AlertDialog.Builder builder=new Builder(this);
    builder.setTitle("请选择你喜欢的课程");
    final String items[]={"android","C","C++","C#","IOs","java","html"};
//用来判断条目是否被选中
    final boolean []checkedItems={true,false,true,false,false,false,false};
    builder.setMultiChoiceItems(items, checkedItems, new OnMultiChoiceClickListener() {
        @Override
           //条目的点击事件
        public void onClick(DialogInterface dialog, int which, boolean isChecked) {
        }
    });
    builder.setPositiveButton("确定"new OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            StringBuffer sb=new StringBuffer();
            for(int i=0;i<checkedItems.length;i++){
                //判断一下选中的
                if(checkedItems[i]){
                    String fruit=items[i];
                    sb.append(fruit+" ");
                }
            }
            Toast.makeText(getApplicationContext(), sb, 1).show();
            dialog.dismiss();
        }
    });
    builder.show();
}  

进度条对话框

//进度条对话框
public void click4(View v){
    //通过构造器来构造
    final ProgressDialog dialog=new ProgressDialog(this);
    dialog.setTitle("正在玩命加载中。。。");
    //设置一下进度条的样式
    dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    //最后一步一定要show()出来
    dialog.show();
    //创建一个子线程
    new Thread(){
        public void run(){
        //设置进度条的最大值
        dialog.setMax(100);
        //设置当前进度
        for(int i=0;i<=100;i++){
            dialog.setProgress(i);
            //睡眠一下
            SystemClock.sleep(50);
        }
        dialog.show();
        dialog.dismiss();
    }}.start();
}  

注意:与对话框有关的控件都可以在子线程中更新UI,最后要对话框显示都要调用show()方法



好了,现在来介绍介绍一下自定义的对话框

实现自定义对话框:

 高低版本默认的背景色和字体颜色不一样、使高低版本保持一致的样式需设置其背景色、文本字体色
  
               /**
             * 享元模式,抽取多次使用的局部变量定义为全局变量
             */
            private AlertDialog dialog;
            private AlertDialog.Builder builder;
            private View view;
            private EditText et_password;
            private Button btn_cancel;
            private Button btn_ok;  
               /**
             * 弹出登录界面对话框
             */
            private void showEnterDialog() {
                //密码存在时弹出
                builder=new Builder(MainActivity.this);
                view=View.inflate(MainActivity.this, R.layout.show_input_dialognull);
                builder.setView(view);
                final EditText et_password_set = (EditText) view.findViewById(R.id.et_passeord);
                btn_cancel = (Button) view.findViewById(R.id.btn_cancel);
                btn_ok = (Button) view.findViewById(R.id.btn_ok);
                
                btn_ok.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                    //获取密码的数值
                        String enterpassword=et_password_set.getText().toString().trim();
                        String sav_password=sp.getString("password"null);
                        if("enterpassword".equals(sav_password)){
                            ToastUtils.show(MainActivity.this"密码正确,准备进入手机防盗界面!",0);
                            boolean finishsetup=sp.getBoolean("finishsetup"false);
                            if(finishsetup){
                                ToastUtils.show(MainActivity.this"已经进行过手机防盗设置!",0);
                                //已经完成手机设置
                                IntentUtils.startActivityInfo(MainActivity.this, PhoneFangDaoActivity.class);
                            }else{
                                //没有完成手机设置
                                IntentUtils.startActivityInfo(MainActivity.this, Setup1Activity.class);
                            }
                            dialog.dismiss();
                        }else
                        {
                            ToastUtils.show(MainActivity.this"密码错误,请重新输入密码!");
                        }
                }
                });
                btn_cancel.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        dialog.dismiss();
                    }
                });
                dialog=builder.show();
            }  

        /**
             * 弹出设置对话框
             */
            public void showSetupDialog() {
                    
                    builder = new Builder(MainActivity.this);
                    //加载一个布局
                    view = View.inflate(MainActivity.this, R.layout.show_setup_dialognull);
                    builder.setView(view);
                    et_password = (EditText) view.findViewById(R.id.et_set_passeord);
                    final EditText et_password_config=(EditText) view.findViewById(R.id.et_passeord_config);
                    
                    btn_cancel = (Button) view.findViewById(R.id.btn_cancel);
                    btn_ok = (Button) view.findViewById(R.id.btn_ok);
                    //对话框的确定事件
                    btn_ok.setOnClickListener(new OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            //获取密码的数值
                            String password=et_password.getText().toString().trim();
                            String passwordConfig=et_password_config.getText().toString().trim();
                            if(TextUtils.isEmpty(password)||TextUtils.isEmpty(passwordConfig)){
                                ToastUtils.show(MainActivity.this"密码不能为空");
                            }
                            if(!password.equals(passwordConfig)){
                                ToastUtils.show(MainActivity.this"两次输入密码不一致!");
                            }
                            if(password.equals(passwordConfig)){
                                Editor edit=sp.edit();
                                //把加密后的密码存起来
                                edit.putString("password", "password");
                                edit.commit();
                                dialog.dismiss();
                                
                                //进入登录界面
                                showEnterDialog();
                            }    
                        }
                    });
                    btn_cancel.setOnClickListener(new OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            dialog.dismiss();
                        }
                    });
                    dialog=builder.show();
                    
            }  

自定义的布局 :  

设置界面布局 show_input_dialog.xml


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="300dp"
    android:layout_height="wrap_content"
   
    android:orientation="vertical" >
    <TextView 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#BFFF01"
        android:text="设置密码"
        android:textSize="30dp"
        android:gravity="center"/>
    <EditText 
        android:gravity="center_horizontal"
        android:layout_width="300dp"
        android:layout_height="wrap_content"
         android:id="@+id/et_set_passeord"
        android:hint="请输入密码"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:inputType="textPassword"/>
    <EditText 
        android:gravity="center_horizontal"
        android:layout_width="300dp"
         android:id="@+id/et_passeord_config"
        android:layout_height="wrap_content"
        android:hint="请确定密码"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:inputType="textPassword"/>
    <LinearLayout 
        android:layout_width="300dp"
        android:orientation="horizontal"
        android:layout_height="wrap_content">
    
        <Button 
            android:layout_width="0dp"
            android:layout_weight="1"
             android:background="@drawable/btn_background"
            android:text="取消"
            android:id="@+id/btn_cancel"
            android:layout_marginRight="5dp"
               android:layout_height="wrap_content"/>
         <Button 
            android:layout_width="0dp"
            android:layout_weight="1"
              android:id="@+id/btn_ok"
            android:layout_marginLeft="5dp"
             android:background="@drawable/btn_background"
            android:text="确定"
               android:layout_height="wrap_content"/>
    </LinearLayout>
</LinearLayout>

登录界面布局show_input_dialog  

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="300dp"
    android:layout_height="wrap_content"
   
    android:orientation="vertical" >
    <TextView 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#BFFF01"
        android:text="登录界面"
        android:textSize="30dp"
        android:gravity="center"/>
    <EditText 
        android:id="@+id/et_passeord"
        android:gravity="center_horizontal"
        android:layout_width="300dp"
        android:layout_height="wrap_content"
        android:hint="请输入密码"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:inputType="textPassword"/>
   
    <LinearLayout 
        android:layout_width="300dp"
        android:orientation="horizontal"
        android:layout_height="wrap_content">
    
        <Button 
            android:layout_width="0dp"
            android:id="@+id/btn_cancel"
            android:layout_weight="1"
             android:background="@drawable/btn_background"
            android:text="取消"
            android:layout_marginRight="5dp"
               android:layout_height="wrap_content"/>
         <Button 
            android:layout_width="0dp"
            android:id="@+id/btn_ok"
            android:layout_weight="1"
            android:layout_marginLeft="5dp"
             android:background="@drawable/btn_background"
            android:text="登录"
               android:layout_height="wrap_content"/>
    </LinearLayout>
</LinearLayout>

看到这里又会问这又是怎么定义
           
    android:background="@drawable/btn_background"这句引用的是资源文件

这就是所谓的状态选择器:


 就是在res目录下建立一个 drawable 文件中定义一个xml文件,设置属性background时引用这个xml文件就行。

    //背景颜色选择
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@android:color/holo_blue_light" android:state_pressed="true">
     <item android:drawable="@android:color/holo_blue_light" android:state_focused="true">
     <item android:drawable="@android:color/holo_green_dark" >
    </item></item></item>
</selector>   




  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

应用程序在运行当中经常要输出各种即时信息,Delphi提供了多种形式的消息对话框可以满足这些要求,尽管可以使用各种标志定制一个消息框,但仍不能将自己的图标放在消息框内,也不能修改其标准行为去创建自己的消息框,其实通过调用函数MessageBoxIndirect()就很容易绕过这些明确的限制,这是一个功能很强、易于使用的函数。 ---- 此函数在WINDOWS单元里面,文件位于Delphi安装路径Source\Rtl\Win里面,需要指出的是,Delphi的原代码中它的返回值类型是BOOL型,而实质上它的返回值应为Integer。修改方法:在WINDOWS单元中找到此函数后,把BOOL改为Integer,共有三处要修改,然后在Delphi安装路径Lib中找到WINDOWS.DCU文件,把它改名或者删除,并把修改后的WINDOWS.PAS源码复制到Lib路径中。 ---- 该函数只有一个参数,类型是TMsgBoxParams,它的结构及说明如下: tagMSGBOXPARAMSA = packed record cbSize: UINT; {数据结构的长度} hwndOwner: HWND; {所有者窗口句柄} hInstance: HINST; {应用程序实例句柄} lpszText: PAnsiChar; {在消息框客户区内显示的文本} lpszCaption: PAnsiChar; {标题栏文本} dwStyle: DWORD; {确定消息框内按钮和图符 的数量及种类的MB_标志} lpszIcon: PAnsiChar; {从资源文件中取出的一个 图符资源的名字} dwContextHelpId: DWORD; {指定帮助文本的ID号} lpfnMsgBoxCallback: TPRMsgBoxCallback; {当用户按下HELP按钮时调用的一个回 调函数} dwLanguageId: DWORD; {显示在按钮内文本的语言定义} end; ---- 由于直接使用此函数比较复杂,我们可以自定义一个函数来封装此函数,对它进行简化,在用法上尽量做到Delphi的消息框相一致,自定义函数代码如下: function MessageEx (lText,lCaption:PChar; lStyle:DWord;lIcon:PChar):Integer; var Msg:TMsgBoxParams; begin Msg.cbSize:=Sizeof(Msg); Msg.hwndOwner:=Application.Handle; Msg.hInstance:=hinstance; Msg.lpszText:=lText; Msg.lpszCaption:=lCaption; Msg.dwStyle:=lStyle; Msg.lpszIcon:=lIcon; Msg.dwContextHelpId:=1; Msg.lpfnMsgBoxCallback:=nil; Msg.dwLanguageId:=LANG_NEUTRAL; Result:=MessageBoxIndirect(Msg); end; ---- 要想在消息框中显示自己的图标,先准备一个装有图标的资源文件,加在程序中,如{$R c:\mydir\myres.res},在lStyle参数里除了所需的MB_标志外还要加上MB_USERICON标志,并在最后一个参数里写上资源文件中图标的名字,如果不想使用自定义的图标,可将最后一个参数设为nil。函数的其它用法和返回值的处理Delphi提供的消息框一样。 ---- 强烈建议把自定义函数放在一个单元文件里,并把此文件放在Delphi的搜索路径如Lib下,以后只需要把此单元加在uses语句里,就可以直接使用自定义函数,非常方便。
©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值