• Dialog详解(包括进度条、PopupWindow、自定义view、自定义样式的对话框)


    Dialog详解(包括进度条、PopupWindow、自定义view、自定义样式的对话框)

     

    Android中提供了多种对话框,在实际应用中我们可能会需要修改这些已有的对话框。本实例就是从实际出发,展现了andorid中大部分对话框,代码中用了一个对话框管理类来做封装,其中还定义了对话框的动画、自定义样式等等。

    主布局文件(全是button)

    复制代码
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:padding="16dp" >
    
        <ScrollView
            android:id="@+id/scrollView1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical" >
    
                <Button
                    android:id="@+id/simple_button_id"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:onClick="buttonListener"
                    android:text="最简单的对话框" />
    
                <Button
                    android:id="@+id/list_button_id"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:onClick="buttonListener"
                    android:text="列表对话框" />
    
                <Button
                    android:id="@+id/singleChoice_button_id"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:onClick="buttonListener"
                    android:text="单选对话框" />
    
                <Button
                    android:id="@+id/multiChoice_button_id"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:onClick="buttonListener"
                    android:text="多选对话框" />
    
                <Button
                    android:id="@+id/adapter_button_id"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:onClick="buttonListener"
                    android:text="用适配器创建的对话框" />
    
                <Button
                    android:id="@+id/view_button_id"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:onClick="buttonListener"
                    android:text="自定义视图的对话框" />
    
                <Button
                    android:id="@+id/progress_button_id"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:onClick="buttonListener"
                    android:text="有进度条的对话框" />
    
                <Button
                    android:id="@+id/activity_button_id"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:onClick="buttonListener"
                    android:text="用Activity作的对话框" />
    
                <Button
                    android:id="@+id/popup_button_id"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:onClick="buttonListener"
                    android:text="用PopupWindow创建的对话框" />
    
                <Button
                    android:id="@+id/date_button_id"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:onClick="buttonListener"
                    android:text="选择日期的对话框" />
    
                <Button
                    android:id="@+id/time_button_id"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:onClick="buttonListener"
                    android:text="选择时间的对话框" />
            </LinearLayout>
        </ScrollView>
    
    </LinearLayout>
    复制代码

    自定义对话框视图

    复制代码
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#f5f5f5"
            android:orientation="vertical" >
    
            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="60dp" >
    
                <ImageView
                    android:id="@+id/dialog_imageView_id"
                    android:layout_width="match_parent"
                    android:layout_height="3dp"
                    android:layout_alignParentBottom="true"
                    android:layout_alignParentLeft="true"
                    android:background="#ffd060" />
    
                <TextView
                    android:id="@+id/dialog_textView_id"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_centerHorizontal="true"
                    android:layout_centerVertical="true"
                    android:text="自定义布局"
                    android:textAppearance="?android:attr/textAppearanceLarge"
                    android:textColor="#50c0e9" />
            </RelativeLayout>
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="20dp"
                android:layout_marginRight="20dp"
                android:layout_marginTop="10dp"
                android:background="@drawable/my_input_box"
                android:paddingLeft="20dp"
                android:paddingRight="20dp" >
    
                <EditText
                    android:id="@+id/dialog_username_EditText_id"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_vertical"
                    android:background="@null"
                    android:ems="10"
                    android:hint="学号/账号"
                    android:inputType="number" >
    
                    <requestFocus />
                </EditText>
            </LinearLayout>
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="20dp"
                android:layout_marginRight="20dp"
                android:background="@drawable/my_input_box"
                android:paddingLeft="20dp"
                android:paddingRight="20dp" >
    
                <EditText
                    android:id="@+id/dialog_password_EditText_id"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_vertical"
                    android:background="@null"
                    android:ems="10"
                    android:hint="密码"
                    android:password="true" />
            </LinearLayout>
    
            <ImageView
                android:layout_width="match_parent"
                android:layout_height="1dp"
                android:layout_marginTop="10dp"
                android:background="#bababa" />
    
            <Button
                android:id="@+id/dialog_logout_button_id"
                android:layout_width="match_parent"
                android:layout_height="45dp"
                android:background="@drawable/layout_selector"
                android:gravity="center_horizontal"
                android:text="确定"
                android:textColor="#535252"
                android:textSize="20sp" />
        </LinearLayout>
    
    </RelativeLayout>
    复制代码

    MainActivity.java

    复制代码
    package com.kale.dialog;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    
    
    public class MainActivity extends Activity {
    
        DialogManager dm;
        String msg = "内容";
        String[] str = new String[] { "android", "java", "ios" };
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            dm = new DialogManager(this);
    
            
        }
    
        public void buttonListener(View v) {
            dm = new DialogManager(this);
            switch (v.getId()) {
            case R.id.simple_button_id:
                dm.simpleDialog("最简单的对话框", msg);
                break;
            case R.id.list_button_id:
                dm.listDialog("列表对话框", str);
                break;
            case R.id.singleChoice_button_id:
                dm.singleChoiceDialog("单选对话框", str);
                break;
            case R.id.multiChoice_button_id:
                dm.MultiChoiceDialog("多选对话框", str);
                break;
            case R.id.adapter_button_id:
                dm.adapterDialog("用适配器建立的对话框", str);
                break;
            case R.id.view_button_id:
                dm.viewDialog("采用自定义视图的对话框");
                break;
            case R.id.progress_button_id:
                dm.progressDialog("含进度条的对话框",msg);
                break;
            case R.id.activity_button_id:
                startActivity(new Intent(MainActivity.this,DialogActivity.class));
                break;
            case R.id.popup_button_id:
                dm.popupWindowDialog("PopupWindows对话框", v);
                break;
            case R.id.date_button_id:
                dm.dateDialog();
                break;
            case R.id.time_button_id:
                dm.timeDialog();
                break;            
            default:
                break;
            }
        }
    
    }
    复制代码

    现在我们分步讲解下各种对话框:

    首先是一个公用的初始化设置和监听器设置

    复制代码
    private Context mContext;
        private AlertDialog.Builder builder;
    
        public DialogManager(Context context) {
            mContext = context;
            builder = new AlertDialog.Builder(mContext);
        }
    
        /**
         * 设置对话框的标题+图标+按钮
         * 
         * @param title
         */
        private void setButton(String title) {
            builder.setTitle(title).setIcon(R.drawable.ic_launcher)
                    .setPositiveButton("好", new positiveListener())
                    .setNeutralButton("中", new NeutralListener())
                    .setNegativeButton("差", new NegativeListener());
            // .setCancelable(false);//设置点击空白处,不能消除该对话框
        }
    
        /**
         * @author:Jack Tony
         * @tips : 监听器
         * @date :2014-7-25
         */
        private class positiveListener implements DialogInterface.OnClickListener {
            @Override
            public void onClick(DialogInterface dialog, int which) {
    
                // dialog.dismiss();//设置对话框强制退出
                showToast("好");
    
            }
        }
    
        private class NeutralListener implements DialogInterface.OnClickListener {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                showToast("中");
            }
        }
    
        private class NegativeListener implements DialogInterface.OnClickListener {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                showToast("差");
            }
        }
    
        private void showToast(String msg) {
            Toast.makeText(mContext, msg, 0).show();
        }
    复制代码

    简易对话框

    复制代码
        /**
         * 简易对话框
         * 
         * @param title
         * @param msg
         */
        public void simpleDialog(String title, String msg) {
            setButton(title);
            builder.setMessage(msg).create().show();
        }
    复制代码

    列表对话框

    复制代码
    /**
         * 列表对话框
         * 
         * @param title
         * @param str
         */
        public void listDialog(String title, final String[] str) {
            setButton(title);
            // 设置了列表就不能设置内容了,否则就会出问题
            builder.setItems(str, new OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    showToast("选中了:" + str[which]);
                }
            }).create().show();
        }
    复制代码

    单选对话框

    复制代码
    /**
         * 单选对话框
         * 
         * @param title
         * @param str
         */
        public void singleChoiceDialog(String title, final String[] str) {
            setButton(title);
            builder
            // 设置选中了第二项
            .setSingleChoiceItems(str, 1, new OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    showToast("选中了:" + str[which]);
                }
            }).create().show();
        }
    复制代码

    多选对话框

    复制代码
        /**
         * 多选对话框
         * 
         * @param title
         * @param str
         */
        public void MultiChoiceDialog(String title, final String[] str) {
            setButton(title);
            builder
            // 默认选中几项
            .setMultiChoiceItems(str, new boolean[] { true, false, true },
                    new OnMultiChoiceClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which,
                                boolean isChecked) {
                            showToast("你选择的id为" + which + " , " + "选中了:"
                                    + str[which]);
                        }
                    }).create().show();
        }
    复制代码

    适配器对话框(可以用各种适配器,比如SimpleAdapter)

    复制代码
        /**
         * 适配器对话框
         * 
         * @param title
         * @param str
         */
        public void adapterDialog(String title, final String[] str) {
            setButton(title);
            builder.setAdapter(
                    new ArrayAdapter<String>(mContext,
                            android.R.layout.simple_list_item_multiple_choice, str),
                    new OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            showToast("选中了:" + str[which]);
                        }
                    }).create().show();
        }
    复制代码

    自定义视图的对话框

    复制代码
    /**
         * 自定义视图对话框
         * 
         * @param title
         */
        public void viewDialog(String title) {
            // LayoutInflater是用来找layout文件夹下的xml布局文件,并且实例化
            LayoutInflater factory = LayoutInflater.from(mContext);
            // 把activity_login中的控件定义在View中
            View view = factory.inflate(R.layout.dialog_layout, null);
            // 将LoginActivity中的控件显示在对话框中
    
            // 获取用户输入的“用户名”,“密码”
            // 注意:view.findViewById很重要,因为上面factory.inflate(R.layout.activity_login,
            // null)将页面布局赋值给了view了
            TextView titleTv = (TextView) view
                    .findViewById(R.id.dialog_textView_id);
            titleTv.setText(title);
            Button btn = (Button) view.findViewById(R.id.dialog_logout_button_id);
            btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View arg0) {
                    showToast("按下自定义视图的按钮了~");
                }
            });
    
            builder
            // 设定显示的View
            .setView(view);
            // 设置dialog是否为模态,false表示模态,true表示非模态
            // ab.setCancelable(false);
            // 对话框的创建、显示,这里显示的位置是在屏幕的最下面,但是很不推荐这个种做法,因为距底部有一段空隙
            AlertDialog dialog = builder.create();
            Window window = dialog.getWindow();
            window.setGravity(Gravity.BOTTOM); // 此处可以设置dialog显示的位置
            window.setWindowAnimations(R.style.myAnimationstyle); // 添加动画
            dialog.show();
        }
    复制代码

    进度条对话框(这里可以定义显示精准进度的、模糊进度的、圆形模糊进度的进度条)

    复制代码
        /**
         * 进度条对话框
         * 
         * @param title
         * @param msg
         */
        public void progressDialog(String title, String msg) {
            final ProgressDialog dialog = new ProgressDialog(mContext);
            dialog.setTitle(title);
            dialog.setMessage(msg);
            dialog.setCancelable(false);// 设置点击空白处也不能关闭该对话框
    
            dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            // dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);//设置采用圆形进度条
    
            dialog.setMax(100);
            // dialog.setIndeterminate(true);//设置不显示明确的进度
            dialog.setIndeterminate(false);// 设置显示明确的进度
    
            dialog.setButton(ProgressDialog.BUTTON_POSITIVE, "确定",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            // 这里添加点击后的逻辑
                        }
                    });
            dialog.setButton(ProgressDialog.BUTTON_NEUTRAL, "中立",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            // 这里添加点击后的逻辑
                        }
                    });
            dialog.setButton(ProgressDialog.BUTTON_NEGATIVE, "取消",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            // 这里添加点击后的逻辑
                        }
                    });
            dialog.show();
    
            //启动线程,模拟一个耗时的操作
            new Thread(new Runnable() {
                @Override
                public void run() {
                    int Progress = 0;
                    while (Progress < 100) {
                        try {
                            Thread.sleep(100);
                            Progress++;
                            // dialog.setProgress(Progress);
                            dialog.incrementProgressBy(1);// 进度条一次加10
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    dialog.dismiss();// 完成后消失
                }
            }).start();
        }
    复制代码

    用PopupWindow做的对话框,PopupWindow特别适合显示从特定位置弹出的的菜单。我这里设置对话框是从底部弹出,用了一些动画效果。

    复制代码
    /**
         * PopupWindow做的对话框 感谢: http://www.apkbus.com/android-56965-1-1.html
         * http://blog.csdn.net/zhufuing/article/details/17783333
         * http://www.open-open.com/lib/view/open1379383271818.html
         * 
         * @param title
         * @param v
         */
        public void popupWindowDialog(String title, View v) {
            // 装载布局文件
            View view = LayoutInflater.from(mContext).inflate(
                    R.layout.dialog_layout, null);
            // 创建PopupWindow对象,添加视图,设置宽高,最后一个参数为设置点击屏幕空白处(按返回键)对话框消失。
            // 也可以用.setFocusable(true);.
            final PopupWindow pWindow = new PopupWindow(view,
                    LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, true);
            pWindow.setBackgroundDrawable(new BitmapDrawable());// 为了让对话框点击空白处消失,必须有这条语句
            pWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);// 出现输入法时,重新布局
            pWindow.setAnimationStyle(R.style.myAnimationstyle);// 设置动画
    
            TextView titleTv = (TextView) view
                    .findViewById(R.id.dialog_textView_id);
            titleTv.setText(title);
            Button btn = (Button) view.findViewById(R.id.dialog_logout_button_id);
            btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View arg0) {
                    showToast("按下PopupWindow中的按钮了~");
                    pWindow.dismiss();
                }
            });
            // 用下拉方式显示
            // pWindow.showAsDropDown(v);
            pWindow.showAtLocation(v, Gravity.BOTTOM, 0, 0);
        }
    复制代码

    动画效果和style文件

    动画文件的目录 res/anim

    dialog_enter.xml

    复制代码
    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android" >
    
        <translate
            android:duration="200"
            android:fromYDelta="100%p"
            android:toYDelta="0" />
    
    </set>
    复制代码

    dialog_exit.xml

    复制代码
    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android" >
    
        <translate
            android:duration="200"
            android:fromYDelta="0"
            android:toYDelta="50%p" />
    
    </set>
    复制代码

    样式文件的目录:values/styles.xml

    复制代码
    <resources>
        
         <style name="myAnimationstyle" parent="android:Animation">  
            <item name="@android:windowEnterAnimation">@anim/dialog_enter</item>  
            <item name="@android:windowExitAnimation">@anim/dialog_exit</item>  
        </style>  
    </resources>
    复制代码

    日期对话框

    复制代码
    /**
         * 日期对话框
         */
        public void dateDialog() {
            Calendar c = Calendar.getInstance();
            DatePickerDialog dialog = new DatePickerDialog(mContext,
                    new DatePickerDialog.OnDateSetListener() {
    
                        @Override
                        public void onDateSet(DatePicker dp, int year, int month,
                                int dayOfMonth) {
                            showToast(year + "-" + (month + 1) + "-" + dayOfMonth);
                        }
                    }, c.get(Calendar.YEAR), c.get(Calendar.MONTH),
                    c.get(Calendar.DAY_OF_MONTH));
            dialog.show();
        }
    复制代码

    时间对话框

    复制代码
        /**
         * 时间对话框
         */
        public void timeDialog() {
            Calendar c = Calendar.getInstance();
            new TimePickerDialog(mContext,
                    new TimePickerDialog.OnTimeSetListener() {
    
                        @Override
                        public void onTimeSet(TimePicker arg0, int hourOfDay,
                                int minute) {
                            showToast(hourOfDay + ":" + minute);
                        }
                    }, c.get(Calendar.HOUR_OF_DAY), c.get(Calendar.MINUTE), true)
                    .show();
        }
    复制代码

    用Activit做的对话框

    DialogActivity.java

    复制代码
    package com.kale.dialog;
    
    import android.app.Activity;
    import android.os.Bundle;
    
    public class DialogActivity extends Activity{
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.dialog_layout);
        }
    }
    复制代码

    首先,定义风格

    复制代码
        <!-- android Dialog去掉标题栏 和边框 -->
         <style name="myDialogTheme" parent="android:Theme.Dialog">
            <item name="android:windowFrame">@null</item><!--边框-->
            <item name="android:windowIsFloating">true</item><!--是否浮现在activity之上-->
            <item name="android:windowIsTranslucent">true</item> <!-- 是否透明 -->
            <item name="android:windowNoTitle">true</item><!--除去title-->
            <item name="android:windowContentOverlay">@null</item> <!-- 对话框是否有遮盖 -->
            <item name="android:backgroundDimEnabled">false</item><!-- 不允许对话框的背景变暗 -->
            <item name="android:windowBackground">@null</item><!--除去背景色-->
        </style> 
    复制代码

    然后,在AndroidManifest.xml中给activity设置风格

    复制代码
            <activity 
                android:name="com.kale.dialog.DialogActivity"
                android:theme="@style/myDialogTheme">
            </activity>
    复制代码

    最后,启动这个activity即可

    startActivity(new Intent(MainActivity.this,DialogActivity.class));

    下面是DialogManager.java工具类的全部代码

    复制代码
    package com.kale.dialog;
    
    import java.util.Calendar;
    
    import android.app.AlertDialog;
    import android.app.DatePickerDialog;
    import android.app.ProgressDialog;
    import android.app.TimePickerDialog;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.content.DialogInterface.OnClickListener;
    import android.content.DialogInterface.OnMultiChoiceClickListener;
    import android.graphics.drawable.BitmapDrawable;
    import android.view.Gravity;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup.LayoutParams;
    import android.view.Window;
    import android.view.WindowManager;
    import android.widget.ArrayAdapter;
    import android.widget.Button;
    import android.widget.DatePicker;
    import android.widget.PopupWindow;
    import android.widget.TextView;
    import android.widget.TimePicker;
    import android.widget.Toast;
    
    public class DialogManager {
    
        private Context mContext;
        private AlertDialog.Builder builder;
    
        public DialogManager(Context context) {
            mContext = context;
            builder = new AlertDialog.Builder(mContext);
        }
    
        /**
         * 简易对话框
         * 
         * @param title
         * @param msg
         */
        public void simpleDialog(String title, String msg) {
            setButton(title);
            builder.setMessage(msg).create().show();
        }
    
        /**
         * 列表对话框
         * 
         * @param title
         * @param str
         */
        public void listDialog(String title, final String[] str) {
            setButton(title);
            // 设置了列表就不能设置内容了,否则就会出问题
            builder.setItems(str, new OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    showToast("选中了:" + str[which]);
                }
            }).create().show();
        }
    
        /**
         * 单选对话框
         * 
         * @param title
         * @param str
         */
        public void singleChoiceDialog(String title, final String[] str) {
            setButton(title);
            builder
            // 设置选中了第二项
            .setSingleChoiceItems(str, 1, new OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    showToast("选中了:" + str[which]);
                }
            }).create().show();
        }
    
        /**
         * 多选对话框
         * 
         * @param title
         * @param str
         */
        public void MultiChoiceDialog(String title, final String[] str) {
            setButton(title);
            builder
            // 默认选中几项
            .setMultiChoiceItems(str, new boolean[] { true, false, true },
                    new OnMultiChoiceClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which,
                                boolean isChecked) {
                            showToast("你选择的id为" + which + " , " + "选中了:"
                                    + str[which]);
                        }
                    }).create().show();
        }
    
        /**
         * 适配器对话框
         * 
         * @param title
         * @param str
         */
        public void adapterDialog(String title, final String[] str) {
            setButton(title);
            builder.setAdapter(
                    new ArrayAdapter<String>(mContext,
                            android.R.layout.simple_list_item_multiple_choice, str),
                    new OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            showToast("选中了:" + str[which]);
                        }
                    }).create().show();
        }
    
        /**
         * 自定义视图对话框
         * 
         * @param title
         */
        public void viewDialog(String title) {
            // LayoutInflater是用来找layout文件夹下的xml布局文件,并且实例化
            LayoutInflater factory = LayoutInflater.from(mContext);
            // 把activity_login中的控件定义在View中
            View view = factory.inflate(R.layout.dialog_layout, null);
            // 将LoginActivity中的控件显示在对话框中
    
            // 获取用户输入的“用户名”,“密码”
            // 注意:view.findViewById很重要,因为上面factory.inflate(R.layout.activity_login,
            // null)将页面布局赋值给了view了
            TextView titleTv = (TextView) view
                    .findViewById(R.id.dialog_textView_id);
            titleTv.setText(title);
            Button btn = (Button) view.findViewById(R.id.dialog_logout_button_id);
            btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View arg0) {
                    showToast("按下自定义视图的按钮了~");
                }
            });
    
            builder
            // 设定显示的View
            .setView(view);
            // 设置dialog是否为模态,false表示模态,true表示非模态
            // ab.setCancelable(false);
            // 对话框的创建、显示,这里显示的位置是在屏幕的最下面,但是很不推荐这个种做法,因为距底部有一段空隙
            AlertDialog dialog = builder.create();
            Window window = dialog.getWindow();
            window.setGravity(Gravity.BOTTOM); // 此处可以设置dialog显示的位置
            window.setWindowAnimations(R.style.myAnimationstyle); // 添加动画
            dialog.show();
        }
    
        /**
         * 进度条对话框
         * 
         * @param title
         * @param msg
         */
        public void progressDialog(String title, String msg) {
            final ProgressDialog dialog = new ProgressDialog(mContext);
            dialog.setTitle(title);
            dialog.setMessage(msg);
            dialog.setCancelable(false);// 设置点击空白处也不能关闭该对话框
    
            dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            // dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);//设置采用圆形进度条
    
            dialog.setMax(100);
            // dialog.setIndeterminate(true);//设置不显示明确的进度
            dialog.setIndeterminate(false);// 设置显示明确的进度
    
            dialog.setButton(ProgressDialog.BUTTON_POSITIVE, "确定",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            // 这里添加点击后的逻辑
                        }
                    });
            dialog.setButton(ProgressDialog.BUTTON_NEUTRAL, "中立",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            // 这里添加点击后的逻辑
                        }
                    });
            dialog.setButton(ProgressDialog.BUTTON_NEGATIVE, "取消",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            // 这里添加点击后的逻辑
                        }
                    });
            dialog.show();
    
            //启动线程,模拟一个耗时的操作
            new Thread(new Runnable() {
                @Override
                public void run() {
                    int Progress = 0;
                    while (Progress < 100) {
                        try {
                            Thread.sleep(100);
                            Progress++;
                            // dialog.setProgress(Progress);
                            dialog.incrementProgressBy(1);// 进度条一次加10
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    dialog.dismiss();// 完成后消失
                }
            }).start();
        }
    
        /**
         * PopupWindow做的对话框 感谢: http://www.apkbus.com/android-56965-1-1.html
         * http://blog.csdn.net/zhufuing/article/details/17783333
         * http://www.open-open.com/lib/view/open1379383271818.html
         * 
         * @param title
         * @param v
         */
        public void popupWindowDialog(String title, View v) {
            // 装载布局文件
            View view = LayoutInflater.from(mContext).inflate(
                    R.layout.dialog_layout, null);
            // 创建PopupWindow对象,添加视图,设置宽高,最后一个参数为设置点击屏幕空白处(按返回键)对话框消失。
            // 也可以用.setFocusable(true);.
            final PopupWindow pWindow = new PopupWindow(view,
                    LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, true);
            pWindow.setBackgroundDrawable(new BitmapDrawable());// 为了让对话框点击空白处消失,必须有这条语句
            pWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);// 出现输入法时,重新布局
            pWindow.setAnimationStyle(R.style.myAnimationstyle);// 设置动画
    
            TextView titleTv = (TextView) view
                    .findViewById(R.id.dialog_textView_id);
            titleTv.setText(title);
            Button btn = (Button) view.findViewById(R.id.dialog_logout_button_id);
            btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View arg0) {
                    showToast("按下PopupWindow中的按钮了~");
                    pWindow.dismiss();
                }
            });
            // 用下拉方式显示
            // pWindow.showAsDropDown(v);
            pWindow.showAtLocation(v, Gravity.BOTTOM, 0, 0);
        }
    
        /**
         * 日期对话框
         */
        public void dateDialog() {
            Calendar c = Calendar.getInstance();
            DatePickerDialog dialog = new DatePickerDialog(mContext,
                    new DatePickerDialog.OnDateSetListener() {
    
                        @Override
                        public void onDateSet(DatePicker dp, int year, int month,
                                int dayOfMonth) {
                            showToast(year + "-" + (month + 1) + "-" + dayOfMonth);
                        }
                    }, c.get(Calendar.YEAR), c.get(Calendar.MONTH),
                    c.get(Calendar.DAY_OF_MONTH));
            dialog.show();
        }
    
        /**
         * 时间对话框
         */
        public void timeDialog() {
            Calendar c = Calendar.getInstance();
            new TimePickerDialog(mContext,
                    new TimePickerDialog.OnTimeSetListener() {
    
                        @Override
                        public void onTimeSet(TimePicker arg0, int hourOfDay,
                                int minute) {
                            showToast(hourOfDay + ":" + minute);
                        }
                    }, c.get(Calendar.HOUR_OF_DAY), c.get(Calendar.MINUTE), true)
                    .show();
        }
    
        /**
         * 设置对话框的标题+图标+按钮
         * 
         * @param title
         */
        private void setButton(String title) {
            builder.setTitle(title).setIcon(R.drawable.ic_launcher)
                    .setPositiveButton("好", new positiveListener())
                    .setNeutralButton("中", new NeutralListener())
                    .setNegativeButton("差", new NegativeListener());
            // .setCancelable(false);//设置点击空白处,不能消除该对话框
        }
    
        /**
         * @author:Jack Tony
         * @tips : 监听器
         * @date :2014-7-25
         */
        private class positiveListener implements DialogInterface.OnClickListener {
            @Override
            public void onClick(DialogInterface dialog, int which) {
    
                // dialog.dismiss();//设置对话框强制退出
                showToast("好");
    
            }
        }
    
        private class NeutralListener implements DialogInterface.OnClickListener {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                showToast("中");
            }
        }
    
        private class NegativeListener implements DialogInterface.OnClickListener {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                showToast("差");
            }
        }
    
        private void showToast(String msg) {
            Toast.makeText(mContext, msg, 0).show();
        }
    }
    复制代码
  • 相关阅读:
    PrintWriter、PrintStream的苦头 缓冲区问题
    BufferedImage与byte[]互转
    求两个日期的间隔天数
    Timer和TimerTask详解
    Java连接Access数据库
    根据value字段对map进行排序
    java collections读书笔记(3)Arrays
    java collections读书笔记(4) stack
    运行时异常与一般异常有何异同?(转)
    java collections读书笔记(7) bitset
  • 原文地址:https://www.cnblogs.com/ldq2016/p/6247904.html
Copyright © 2020-2023  润新知