0x002 Dialog

0x000 环境:


  • 系统:Win10
  • IDE:Android Studio2.0

0x002 简单使用


  • 继承树:
    Dialog是AlertDialog、DatePickerDialog、ProgressDialog等一些常用Dialog的直接或者间接父类,但是官网文档说我们应当避免直接使用父类,而应该使用他们的子类。


    Paste_Image.png
  • AlertDialog最简单使用方式:

    • 代码:

      AlertDialog.Builder builder=new AlertDialog.Builder(DialogActivity.this);
              builder.setTitle("SimpleAlert");
              builder.setMessage("are you ok");
              builder.setNegativeButton("Cancle", new DialogInterface.OnClickListener() {
                  @Override
                  public void onClick(DialogInterface dialog, int which) {
                      Toast.makeText(getApplicationContext(),"you click cancle",Toast.LENGTH_LONG).show();
      
                  }
              });
              builder.setPositiveButton("Sure", new DialogInterface.OnClickListener() {
                  @Override
                  public void onClick(DialogInterface dialog, int which) {
                      Toast.makeText(getApplicationContext(),"you click sure",Toast.LENGTH_LONG).show();
      
                  }
              });
              builder.create().show();
      
    • 效果:


      Paste_Image.png

    -说明:Dialog使用的是建造者模式,所以我们要用build来建造一个dialog,同时根据建造者模式的特性,我们还可以这么写:

        AlertDialog.Builder builder=new AlertDialog.Builder(DialogActivity.this);
              builder.setTitle("SimpleAlert").
              setMessage("are you ok").
              setNegativeButton("Cancle", new DialogInterface.OnClickListener() {
                  @Override
                  public void onClick(DialogInterface dialog, int which) {
                      Toast.makeText(getApplicationContext(),"you click cancle",Toast.LENGTH_LONG).show();
    
                  }
              }).
              setPositiveButton("Sure", new DialogInterface.OnClickListener() {
                  @Override
                  public void onClick(DialogInterface dialog, int which) {
                      Toast.makeText(getApplicationContext(),"you click sure",Toast.LENGTH_LONG).show();
    
                  }
              }).create().show();
    
  • DialogFragment
    官网中推荐我们不应当这么使用,而是应该使用DialogFragment,因为这样可以更好地管理Dialog的生命周期和方法。所以接下来都会使用DialogFragment的方式来写

    • 代码:
      //MyDialogFragment.java
      public class MyDialogFragment extends android.support.v4.app.DialogFragment {
      @NonNull
      @Override
      public Dialog onCreateDialog(Bundle savedInstanceState) {
      AlertDialog.Builder builder=new AlertDialog.Builder(getActivity());
      builder.setTitle("first alert");
      builder.setMessage("are you OK");
      builder.setPositiveButton("Sure", new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialog, int which) {
      Toast.makeText(getContext(),"you click sure",Toast.LENGTH_LONG).show();
      }
      });
      builder.setNegativeButton("Cancle", new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialog, int which) {
      Toast.makeText(getContext(),"you click cancle",Toast.LENGTH_LONG).show();

          }
      });
      return builder.create();
      }
      }
      //DialogActivity
      MyDialogFragment myDialogFragment=new MyDialogFragment();
      myDialogFragment.show(getSupportFragmentManager(),"");
      

0x003 AlertDialog


  • 再添加一个按钮
    • 代码:
      public class NatureButtonFragment extends DialogFragment {
      @NonNull
      @Override
      public Dialog onCreateDialog(Bundle savedInstanceState) {
      AlertDialog.Builder builder=new AlertDialog.Builder(getActivity());
      builder.setTitle("more button")
      .setMessage("more button")
      //确认按钮
      .setNegativeButton("SURE", new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialog, int which) {
      Toast.makeText(getContext(),"you click sure",Toast.LENGTH_LONG).show();

                  }
              })
              //取消按钮
              .setPositiveButton("CANCLE", new DialogInterface.OnClickListener() {
                  @Override
                  public void onClick(DialogInterface dialog, int which) {
                      Toast.makeText(getContext(),"you click cancle",Toast.LENGTH_LONG).show();
      
                  }
              })
              //第三个按钮,不是确认也不是取消,而是介于二者中间,例如Remind Me Later
              .setNeutralButton("REMAIND ME LATER", new DialogInterface.OnClickListener() {
                  @Override
                  public void onClick(DialogInterface dialog, int which) {
                      Toast.makeText(getContext(),"you click later",Toast.LENGTH_LONG).show();
                  }
              });
      return builder.create();
      
      }
      }
      
    • 效果

Paste_Image.png
  • 添加一个列表
  • 代码:
    //ListDialogFragment.java
    public class ListDialogFragment extends DialogFragment {
    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
    final String s[] = new String[]{"item1", "item2", "item3"};
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setTitle("List")
    .setItems(s, new DialogInterface.OnClickListener() {
    @TargetApi(Build.VERSION_CODES.M)
    @Override
    public void onClick(DialogInterface dialog, int which) {
    Toast.makeText(getContext(), "you click " + s[which], Toast.LENGTH_LONG).show();
    }
    });
    return builder.create();
    }
    }
  • 效果:
Paste_Image.png
  • 添加一列单选按钮
    • 代码:
      public class ListDialogFragment extends DialogFragment {
      @NonNull
      @Override
      public Dialog onCreateDialog(Bundle savedInstanceState) {
      final String s[] = new String[]{"item1", "item2", "item3"};
      AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
      builder.setTitle("List")
      .setItems(s, new DialogInterface.OnClickListener() {
      @TargetApi(Build.VERSION_CODES.M)
      @Override
      public void onClick(DialogInterface dialog, int which) {
      Toast.makeText(getContext(), "you click " + s[which], Toast.LENGTH_LONG).show();
      }
      });
      return builder.create();
      }
      }
    • 效果:
Paste_Image.png
  • 添加一列多选按钮
    • 代码:
      public class MultipChoiceDialogFragment extends DialogFragment {
      @TargetApi(Build.VERSION_CODES.M)
      @NonNull
      @Override
      public Dialog onCreateDialog(Bundle savedInstanceState) {
      final String s[]={"item1","item2","item3"};
      final boolean s2[]={true,false,false};

                AlertDialog.Builder builder=new AlertDialog.Builder(getContext());
                builder.setMultiChoiceItems(s, s2, new DialogInterface.OnMultiChoiceClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                        Toast.makeText(getContext(),s[which]+" isChecked is "+isChecked,Toast.LENGTH_LONG).show();
                    }
                });
                return builder.create();
            }
        }
      
    -效果:
Paste_Image.png
  • 自定义视图
    • 代码:
      //CustomerDialogFragment.java
      public class CustomerDialogFragment extends DialogFragment {
      @TargetApi(Build.VERSION_CODES.M)
      @NonNull
      @Override
      public Dialog onCreateDialog(Bundle savedInstanceState) {
      AlertDialog.Builder builder=new AlertDialog.Builder(getContext());
      builder.setView(R.layout.fragment_dialog_customer);
      return builder.create();
      }
      }
      //R.layout.fragment_dialog_customer.xml
      <?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:padding="20dp"
      android:layout_height="match_parent">
      <EditText
      android:hint="username"
      android:inputType="textEmailAddress"
      android:layout_width="match_parent"
      android:layout_height="wrap_content" />
      <EditText
      android:hint="password"
      android:inputType="textPassword"
      android:layout_width="match_parent"
      android:layout_height="wrap_content" />
      <LinearLayout
      android:layout_width="match_parent"
      android:layout_height="wrap_content">
      <Button
      android:text="REGISTER"
      android:layout_weight="1"
      android:layout_width="0px"
      android:layout_height="wrap_content" />
      <Button
      android:text="LOGIN"
      android:layout_weight="1"
      android:layout_width="0px"
      android:layout_height="wrap_content" />
      </LinearLayout>
      </LinearLayout>
    • 效果:
Paste_Image.png
  • 在activity中处理按钮事件:
    • 代码:
      //EventBackDialogFragment .java
      public class EventBackDialogFragment extends DialogFragment {
      public interface EventBackDialogListener{
      public void OnPositiveClick(DialogFragment dialogFragment);
      public void OnNegativeClick(DialogFragment dialogFragment);
      }
      EventBackDialogListener mListener;
      @NonNull
      @Override
      public Dialog onCreateDialog(Bundle savedInstanceState) {

                AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
                builder.setNegativeButton("Cancle", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        mListener.OnNegativeClick(EventBackDialogFragment.this);
                    }
                })
                        .setPositiveButton("SURE", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                mListener.OnPositiveClick(EventBackDialogFragment.this);
                            }
                        });
                return builder.create();
        
            }
        
            @Override
            public void onAttach(Activity activity) {
        
                super.onAttach(activity);
                mListener= (EventBackDialogListener) activity;
            }
        }
        //DialogActivity
      public class DialogActivity extends ListActivity implements   EventBackDialogFragment.EventBackDialogListener {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
          EventBackDialogFragment eventBackDialogFragment=new EventBackDialogFragment();
            eventBackDialogFragment.show(getFragmentManager(),"");
        }
       @Override
      public void OnPositiveClick(android.app.DialogFragment dialogFragment) {
      Toast.makeText(getApplicationContext(),"you  click Sure",Toast.LENGTH_LONG).show();
      
      }
      
      @Override
      public void OnNegativeClick(android.app.DialogFragment dialogFragment) {
       Toast.makeText(getApplicationContext(),"you  click Cancle",Toast.LENGTH_LONG).show();
      
      }
      }
      

0x004 ProgressDialog


  • 概述:progressDialog和DatapickerDilaog等其实不过是AlertDialog的子类,所以说白了,不过是一个封装好的Dialog,比如progressDlialog不过是封装了一个progress的AlertDialog。
Paste_Image.png
  • progressDialog进度条
    • 代码:
      public class ProgressDialogFragment extends DialogFragment {
      @TargetApi(Build.VERSION_CODES.M)
      @NonNull
      @Override
      public Dialog onCreateDialog(Bundle savedInstanceState) {

              ProgressDialog progressDialog=new ProgressDialog(getContext());
              return progressDialog;
          }
      }
      
    • 效果图

Paste_Image.png
  • 带进度的progress
    在ProgressDialog.java中,有一个方法名为setProgressStyle(int style ),我们跳到mProgressStyle,就会看到
    public static final int STYLE_SPINNER = 0;//spinner进度条
    public static final int STYLE_HORIZONTAL = 1;//horizontal进度条
    Paste_Image.png
Paste_Image.png
  • 代码:

     public class ProgressHorizatalDialogFragment extends DialogFragment {
       @TargetApi(Build.VERSION_CODES.M)
       @NonNull
       @Override
       public Dialog onCreateDialog(Bundle savedInstanceState) {
    
           ProgressDialog progressDialog=new ProgressDialog(getContext());
           progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
           progressDialog.setMessage("正在下载");
           progressDialog.setProgress(20);
           progressDialog.setMax(100);
           return progressDialog;
       }
     }
    
  • 效果

Paste_Image.png

0x005 DatePickerDialog


  • 代码:
    public class DatePickerDialogFragment extends DialogFragment {
    @TargetApi(Build.VERSION_CODES.M)
    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
    DatePickerDialog datePickerDialog=new DatePickerDialog(getContext(), new DatePickerDialog.OnDateSetListener() {
    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {

                  }
              },2016,10,12);
              return datePickerDialog;
      
          }
      }
    
  • 效果:

Paste_Image.png

TimePickerDialog

  • 代码
    public class TimePickerDialogFragment extends DialogFragment {
    @TargetApi(Build.VERSION_CODES.M)
    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
    TimePickerDialog timePickerDialog=new TimePickerDialog(getContext(), new TimePickerDialog.OnTimeSetListener() {
    @Override
    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
    Toast.makeText(getContext(),"you choice"+hourOfDay+":"+minute,Toast.LENGTH_LONG).show();
    }
    },12,12,true);
    timePickerDialog.show();
    return timePickerDialog;
    }
    }
  • 效果
Paste_Image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容