【攻克Android (14)】Dialog 对话框

本文围绕以下两个部分展开:

一、一个案例
        1、主界面
        2、对话框
        3、列表对话框
        4、单选对话框
        5、多选对话框
        6、自定义对话框

附   代码补充






一、一个案例

        1、主界面

【攻克Android (14)】Dialog 对话框


        activity_main.xml :

 <RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"  
                 android:paddingLeft="@dimen/activity_horizontal_margin"  
                 android:paddingRight="@dimen/activity_horizontal_margin"  
                 android:paddingTop="@dimen/activity_vertical_margin"  
                 tools:context=".MainActivity">  
   
   <Button  
       android:id="@+id/btnAlertDialog"  
       android:layout_width="wrap_content"  
       android:layout_height="wrap_content"  
       android:onClick="onClick"  
       android:text="@string/btn_alert_dialog"/>  
   
   <Button  
       android:id="@+id/btnListAlertDialog"  
       android:layout_width="wrap_content"  
       android:layout_height="wrap_content"  
       android:layout_below="@+id/btnAlertDialog"  
       android:onClick="onClick"  
       android:text="@string/btn_list_alert_dialog"/>  
   
   <Button  
       android:id="@+id/btnSingleListAlertDialog"  
       android:layout_width="wrap_content"  
       android:layout_height="wrap_content"  
       android:layout_below="@+id/btnListAlertDialog"  
       android:onClick="onClick"  
       android:text="@string/btn_single_list_alert_dialog"/>  
   
   <Button  
       android:id="@+id/btnMultiListAlertDialog"  
       android:layout_width="wrap_content"  
       android:layout_height="wrap_content"  
       android:layout_below="@+id/btnSingleListAlertDialog"  
       android:onClick="onClick"  
       android:text="@string/btn_multi_list_alert_dialog"/>  
   
   <Button  
       android:id="@+id/btnCustomDialog"  
       android:layout_width="wrap_content"  
       android:layout_height="wrap_content"  
       android:layout_below="@+id/btnMultiListAlertDialog"  
       android:onClick="onClick"  
       android:text="@string/btn_custom_dialog"/>  
  
 </RelativeLayout>


        2、对话框

【攻克Android (14)】Dialog 对话框


【攻克Android (14)】Dialog 对话框


【攻克Android (14)】Dialog 对话框


【攻克Android (14)】Dialog 对话框


 private void alertDialog() {  
     // Builder 模式:建造者模式  
     // AlertDialog 的构造方法【受保护】,使用 Builder 创建对话框  
     AlertDialog.Builder builder = new AlertDialog.Builder(this);  
     // 设置对话框的图标 / 标题 / 内容  
     builder.setIcon(R.mipmap.ic_launcher);  
     builder.setTitle(getString(R.string.app_name));  
     builder.setMessage("夜深了~~~");  
  
     // 不可取消【默认 true】  
     builder.setCancelable(false);  
   
     // 设置按钮:确定、取消、中立【显示的位置固定】  
     builder.setPositiveButton(R.string.button_ok, new DialogInterface.OnClickListener() {  
         @Override  
         public void onClick(DialogInterface dialog, int which) {  
             showToast("OK Button.");  
         }  
     });  
     builder.setNegativeButton(R.string.button_cancel, new DialogInterface.OnClickListener() {  
         @Override  
         public void onClick(DialogInterface dialog, int which) {  
             showToast("Cancel Button.");  
         }  
     });  
     builder.setNeutralButton(R.string.button_neutral, new DialogInterface.OnClickListener() {  
         @Override  
         public void onClick(DialogInterface dialog, int which) {  
             showToast("Neutral Button.");  
         }  
     });  
   
     // 创建对话框  
     AlertDialog dialog = builder.create();  
     dialog.show();  
 }


        3、列表对话框

【攻克Android (14)】Dialog 对话框


【攻克Android (14)】Dialog 对话框


 private void listAlertDialog() {  
     AlertDialog.Builder builder = new AlertDialog.Builder(this);  
     // 设置对话框的图标 / 标题   
     builder.setIcon(R.mipmap.ic_launcher);  
     builder.setTitle(getString(R.string.btn_list_alert_dialog));  
   
     // 参数一:数据  
     // 参数二:选项的事件  
     builder.setItems(items, new DialogInterface.OnClickListener() {  
         @Override  
         public void onClick(DialogInterface dialog, int which) {  
             // 点击哪个选项就显示此选项 (which - 字符串数组的下标)  
             showToast(items[which]);  
         }  
     });  
   
     //  设置 取消 按钮,无监听事件  
     builder.setNegativeButton(R.string.button_cancel, null);  
   
     AlertDialog dialog = builder.create();  
     dialog.show();  
 }


        4、单选对话框

【攻克Android (14)】Dialog 对话框


 private void singleListAlertDialog() {  
     AlertDialog.Builder builder = new AlertDialog.Builder(this);  
     builder.setIcon(R.mipmap.ic_launcher);  
     builder.setTitle(getString(R.string.btn_single_list_alert_dialog));  
   
     // 参数一:列表中的数据集  
     // 参数二:默认选中的位置,-1 无默认选中项  
     builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {  
         @Override  
         public void onClick(DialogInterface dialog, int which) {  
             // 点击哪个选项就显示此选项 (which - 字符串数组的下标)  
             showToast(items[which]);  
         }  
     });  
     builder.setNegativeButton(R.string.button_cancel, null);  
     builder.setPositiveButton(R.string.button_ok, null);  
  
     AlertDialog dialog = builder.create();  
     dialog.show();  
 }


        5、多选对话框

【攻克Android (14)】Dialog 对话框


【攻克Android (14)】Dialog 对话框


 private void multiListAlertDialog() {  
     AlertDialog.Builder builder = new AlertDialog.Builder(this);  
     builder.setIcon(R.mipmap.ic_launcher);  
     builder.setTitle(getString(R.string.btn_multi_list_alert_dialog));  
   
     builder.setCancelable(false);  
     final boolean[] checkedItems = new boolean[items.length];  
   
     // 参数一:列表中的数据集  
     // 参数二:列表中各项的状态(true 为选中、false 为未选中)  
     // 参数三:多选监听器  
     builder.setMultiChoiceItems(items, checkedItems, new DialogInterface.OnMultiChoiceClickListener() {  
         @Override  
         public void onClick(DialogInterface dialog, int which, boolean isChecked) {  
             checkedItems[which] = isChecked;  
         }  
     });  
   
     builder.setPositiveButton(R.string.button_ok, new DialogInterface.OnClickListener() {  
         @Override  
         public void onClick(DialogInterface dialog, int which) {  
             String text = "";  
   
             for (int i = 0; i < items.length; i++) {  
                 if (checkedItems[i]) {  
                     text += items[i] + ",";  
                 }  
             }  
             if (text.length() > 0) {  
                 text = text.substring(0, text.length() - 1);  
             } else {  
                 text = "你还没有选呢~";  
             }  
             showToast(text + "\n" + Arrays.toString(checkedItems));  
         }  
     });  
   
     AlertDialog dialog = builder.create();  
     dialog.show();  
 }


        6、自定义对话框

【攻克Android (14)】Dialog 对话框


【攻克Android (14)】Dialog 对话框


【攻克Android (14)】Dialog 对话框


        (1)dialog_custom.xml :

 <?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:orientation="vertical"  
               android:padding="@dimen/activity_horizontal_margin">  
   
   <EditText  
       android:id="@+id/txtName"  
       android:layout_width="match_parent"  
       android:layout_height="wrap_content"  
       android:hint="@string/hint_name"/>  
   
   <EditText  
       android:id="@+id/txtPassword"  
       android:layout_width="match_parent"  
       android:layout_height="wrap_content"  
       android:hint="@string/hint_password"  
       android:inputType="textPassword"/>  
 </LinearLayout>


        (2)

 private void customDialog() {  
     AlertDialog.Builder builder = new AlertDialog.Builder(this);  
     builder.setIcon(R.mipmap.ic_launcher);  
     builder.setTitle(getString(R.string.btn_custom_dialog));  
   
     // 使用指定布局文件填充视图  
     View view = this.getLayoutInflater().inflate(  
             R.layout.dialog_custom, null);  
     txtName = (EditText) view.findViewById(R.id.txtName);  
     txtPassword = (EditText) view.findViewById(R.id.txtPassword);  
   
     // 设置对话框的视图  
     builder.setView(view);  
   
     builder.setNegativeButton(R.string.button_cancel, null);  
     builder.setPositiveButton(R.string.button_ok, new DialogInterface.OnClickListener() {  
         @Override  
         public void onClick(DialogInterface dialog, int which) {  
             String name = txtName.getText().toString();  
             String password = txtPassword.getText().toString();  
             showToast(name + "\n" + password);  
         }  
     });  
   
     AlertDialog dialog = builder.create();  
     dialog.show();  
 }



附   代码补充

        1. styles.xml(v21) :

 <?xml version="1.0" encoding="utf-8"?>  
 <resources>  
   
     <style name="AppTheme" parent="android:Theme.Material.Light">  
         <item name="android:colorPrimaryDark">@android:color/holo_blue_dark</item>  
         <item name="android:colorPrimary">@android:color/holo_blue_light</item>  
         <item name="android:navigationBarColor">@android:color/transparent</item>  
     </style>  
 </resources>


        2. strings.xml :

 <resources>  
   <string name="app_name">Dialog</string>  
   
   <string name="action_settings">Settings</string>  
  
   <string name="btn_alert_dialog">对话框</string>  
   <string name="btn_list_alert_dialog">列表对话框</string>  
   <string name="btn_single_list_alert_dialog">单选列表对话框</string>  
   <string name="btn_multi_list_alert_dialog">多选列表对话框</string>  
   <string name="btn_custom_dialog">自定义对话框</string>  
   
   <string name="button_ok">确定</string>  
   <string name="button_cancel">取消</string>  
   <string name="button_neutral">了解更多</string>  
   
   <string name="hint_name">网络名</string>  
   <string name="hint_password">密码</string>  
   
   <string-array name="skills">  
     <item>Android</item>  
     <item>iOS</item>  
     <item>Windows</item>  
     <item>Web</item>  
     <item>C/C++</item>  
   </string-array>  
 </resources>


        3. MainActivity :

 package com.android.dialog;  
  
 import android.app.Activity;  
 import android.app.AlertDialog;  
 import android.content.DialogInterface;  
 import android.os.Bundle;  
 import android.view.Menu;  
 import android.view.MenuItem;  
 import android.view.View;  
 import android.widget.EditText;  
 import android.widget.Toast;  
 
 import java.util.Arrays;  
 
 public class MainActivity extends Activity {  
     private String[] items;  
   
     private EditText txtName;  
     private EditText txtPassword;  
   
     @Override  
     protected void onCreate(Bundle savedInstanceState) {  
         super.onCreate(savedInstanceState);  
         setContentView(R.layout.activity_main);  
   
         // 通过读取资源文件 strings.xml 获得指定的字符串数组  
         items = this.getResources().getStringArray(R.array.skills);  
     }  
 
     public void onClick(View view) {  
         switch (view.getId()) {  
             case R.id.btnAlertDialog:  
                 alertDialog();  
                 break;  
             case R.id.btnListAlertDialog:  
                 listAlertDialog();  
                 break;  
             case R.id.btnSingleListAlertDialog:  
                 singleListAlertDialog();  
                 break;  
             case R.id.btnMultiListAlertDialog:  
                 multiListAlertDialog();  
                 break;  
             case R.id.btnCustomDialog:  
                 customDialog();  
                 break;  
         }  
     }  
   
     private void customDialog() {  
         AlertDialog.Builder builder = new AlertDialog.Builder(this);  
         builder.setIcon(R.mipmap.ic_launcher);  
         builder.setTitle(getString(R.string.btn_custom_dialog));  
   
         // 使用指定布局文件填充视图  
         View view = this.getLayoutInflater().inflate(  
                 R.layout.dialog_custom, null);  
         txtName = (EditText) view.findViewById(R.id.txtName);  
         txtPassword = (EditText) view.findViewById(R.id.txtPassword);  
   
         // 设置对话框的视图  
         builder.setView(view);  
   
         builder.setNegativeButton(R.string.button_cancel, null);  
         builder.setPositiveButton(R.string.button_ok, new DialogInterface.OnClickListener() {  
             @Override  
             public void onClick(DialogInterface dialog, int which) {  
                 String name = txtName.getText().toString();  
                 String password = txtPassword.getText().toString();  
                 showToast(name + "\n" + password);  
             }  
         });  
   
         AlertDialog dialog = builder.create();  
         dialog.show();  
     }  
  
     private void multiListAlertDialog() {  
         AlertDialog.Builder builder = new AlertDialog.Builder(this);  
         builder.setIcon(R.mipmap.ic_launcher);  
         builder.setTitle(getString(R.string.btn_multi_list_alert_dialog));  
   
         builder.setCancelable(false);  
         final boolean[] checkedItems = new boolean[items.length];  
   
         // 参数一:列表中的数据集  
         // 参数二:列表中各项的状态(true 为选中、false 为未选中)  
         // 参数三:多选监听器  
         builder.setMultiChoiceItems(items, checkedItems, new DialogInterface.OnMultiChoiceClickListener() {  
             @Override  
             public void onClick(DialogInterface dialog, int which, boolean isChecked) { 
                 checkedItems[which] = isChecked;  
             }  
         });  
   
         builder.setPositiveButton(R.string.button_ok, new DialogInterface.OnClickListener() {  
             @Override  
             public void onClick(DialogInterface dialog, int which) {  
                 String text = "";  
   
                 for (int i = 0; i < items.length; i++) {  
                     if (checkedItems[i]) {  
                         text += items[i] + ",";  
                     }  
                 }  
                 if (text.length() > 0) {  
                     text = text.substring(0, text.length() - 1);  
                 } else {  
                     text = "你还没有选呢~";  
                 }  
                 showToast(text + "\n" + Arrays.toString(checkedItems));  
             }  
         });  
   
         AlertDialog dialog = builder.create();  
         dialog.show();  
     }  

     private void singleListAlertDialog() {  
         AlertDialog.Builder builder = new AlertDialog.Builder(this);  
         builder.setIcon(R.mipmap.ic_launcher);  
         builder.setTitle(getString(R.string.btn_single_list_alert_dialog));  
   
         // 参数一:列表中的数据集  
         // 参数二:默认选中的位置,-1 无默认选中项  
         builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() { 
             @Override  
             public void onClick(DialogInterface dialog, int which) {  
                 // 点击哪个选项就显示此选项 (which - 字符串数组的下标)  
                 showToast(items[which]);  
             }  
         });  
         builder.setNegativeButton(R.string.button_cancel, null);  
         builder.setPositiveButton(R.string.button_ok, null);  
   
         AlertDialog dialog = builder.create();  
         dialog.show();  
     }  
  
     private void listAlertDialog() {  
         AlertDialog.Builder builder = new AlertDialog.Builder(this);  
         // 设置对话框的图标 / 标题 / 内容  
         builder.setIcon(R.mipmap.ic_launcher);  
         builder.setTitle(getString(R.string.btn_list_alert_dialog));  
   
         // 参数一:数据  
         // 参数二:选项的事件  
         builder.setItems(items, new DialogInterface.OnClickListener() {  
             @Override  
             public void onClick(DialogInterface dialog, int which) {  
                 // 点击哪个选项就显示此选项 (which - 字符串数组的下标)  
                 showToast(items[which]);  
             }  
         });  
  
         //  设置 取消 按钮,无监听事件  
         builder.setNegativeButton(R.string.button_cancel, null);  
   
         AlertDialog dialog = builder.create();  
         dialog.show();  
     }  
   
     private void alertDialog() {  
         // Builder 模式:建造者模式  
         // AlertDialog 的构造方法【受保护】,使用 Builder 创建对话框  
         AlertDialog.Builder builder = new AlertDialog.Builder(this);  
         // 设置对话框的图标 / 标题 / 内容  
         builder.setIcon(R.mipmap.ic_launcher);  
         builder.setTitle(getString(R.string.app_name));  
         builder.setMessage("夜深了~~~");  
   
         // 不可取消【默认 true】  
         builder.setCancelable(false);  
   
         // 设置按钮:确定、取消、中立【显示的位置固定】  
         builder.setPositiveButton(R.string.button_ok, new DialogInterface.OnClickListener() {  
             @Override  
             public void onClick(DialogInterface dialog, int which) {  
                 showToast("OK Button.");  
             }  
         });  
         builder.setNegativeButton(R.string.button_cancel, new DialogInterface.OnClickListener() {  
             @Override  
             public void onClick(DialogInterface dialog, int which) {  
                 showToast("Cancel Button.");  
             }  
         });  
         builder.setNeutralButton(R.string.button_neutral, new DialogInterface.OnClickListener() {  
             @Override  
             public void onClick(DialogInterface dialog, int which) {  
                 showToast("Neutral Button.");  
             }  
         });  
   
         // 创建对话框  
         AlertDialog dialog = builder.create();  
         dialog.show();  
     }  
   
     private void showToast(String text) {  
         Toast.makeText(this, text, Toast.LENGTH_SHORT).show();  
     }  
   
     @Override  
     public boolean onCreateOptionsMenu(Menu menu) {  
         // Inflate the menu; this adds items to the action bar if it is present.  
         getMenuInflater().inflate(R.menu.menu_main, menu);  
         return true;  
     }  
   
     @Override  
     public boolean onOptionsItemSelected(MenuItem item) {  
         // Handle action bar item clicks here. The action bar will  
         // automatically handle clicks on the Home/Up button, so long  
         // as you specify a parent activity in AndroidManifest.xml.  
        int id = item.getItemId();  
   
        //noinspection SimplifiableIfStatement  
        if (id == R.id.action_settings) {  
             return true;  
        }  
  
         return super.onOptionsItemSelected(item);  
     }  
 }

你可能感兴趣的:(android)