Android UI系列-----Dialog對(duì)話(huà)框示例
在Android開(kāi)發(fā)當(dāng)中,在界面上彈出一個(gè)Dialog對(duì)話(huà)框使我們經(jīng)常需要做的,本篇隨筆將詳細(xì)的講解Dialog對(duì)話(huà)框這個(gè)概念,包括定義不同樣式的對(duì)話(huà)框。
一、Dialog
我們首先來(lái)看看android官方文檔對(duì)Dialog的介紹
A dialog is a small window that prompts the user to make a decision or enter additional information. A dialog does not fill the screen and is normally used for modal events that require users to take an action before they can proceed.
dialog就是一個(gè)在屏幕上彈出一個(gè)可以讓用戶(hù)做出一個(gè)選擇,或者輸入額外的信息的對(duì)話(huà)框,一個(gè)對(duì)話(huà)框并不會(huì)沾滿(mǎn)我們整個(gè)的屏幕,并且通常用于模型事件當(dāng)中需要用戶(hù)做出一個(gè)決定后才會(huì)繼續(xù)執(zhí)行。
Dialog類(lèi)是dialog對(duì)話(huà)框的基類(lèi),但是我們應(yīng)該避免直接使用這個(gè)類(lèi)來(lái)實(shí)例化一個(gè)dialog對(duì)話(huà)框,我們應(yīng)當(dāng)使用其子類(lèi)來(lái)得到一個(gè)對(duì)話(huà)框:
java.lang.Object
↳ android.app.Dialog
Known Direct Subclasses
AlertDialog, CharacterPickerDialog, MediaRouteChooserDialog, MediaRouteControllerDialog, Presentation
Known Indirect Subclasses
DatePickerDialog, ProgressDialog, TimePickerDialog
我們看到,Dialog有很多的子類(lèi)實(shí)現(xiàn),所以我們要定義一個(gè)對(duì)話(huà)框,使用其子類(lèi)來(lái)實(shí)例化一個(gè)即可,而不要直接使用Dialog這個(gè)父類(lèi)來(lái)構(gòu)造。
二、AlertDialog
今天我們重點(diǎn)要來(lái)了解的就是AlertDialog對(duì)話(huà)框,我們看到,AlertDialog是Dialog的一個(gè)直接子類(lèi)。
使用AlertDialog,我們可以顯示一個(gè)標(biāo)題,最多3個(gè)按鈕操作,以及一組選擇框或者是自己定義的彈出框。
這里借用android的官方文檔提供的一個(gè)圖來(lái)看看AlertDialog框的組成:

①區(qū)域1那里就是定義彈出框的頭部信息,包括標(biāo)題名或者是一個(gè)圖標(biāo)。
②區(qū)域2那里是AlertDialog對(duì)話(huà)框的content部分,在這里我們可以設(shè)置一些message信息,或者是定義一組選擇框,還可以定義我們自己的布局彈出框。
③區(qū)域3那里使我們的Action Buttons部分,這里我們可以定義我們的操作按鈕。
說(shuō)到Action Buttons這里要特別注意一下:
在AlertDialog中,定義按鈕都是通過(guò) setXXXButton 方法來(lái)完成,其中一共有3種不同的Action Buttons供我們選擇:
1.setPositiveButton(CharSequence text, DialogInterface.OnClickListener listener)這是一個(gè)相當(dāng)于OK、確定操作的按鈕。
2.setNegativeButton (CharSequence text, DialogInterface.OnClickListener listener)這是一個(gè)相當(dāng)于取消操作的按鈕。
3. setNeutralButton (CharSequence text, DialogInterface.OnClickListener listener)這個(gè)是相當(dāng)于一個(gè)忽略操作的按鈕。
我們每一種action buttons最多只能出現(xiàn)一個(gè),即彈出對(duì)話(huà)框最多只能出現(xiàn)一個(gè)PositiveButton。
接下來(lái)我們通過(guò)一個(gè)一個(gè)的具體實(shí)例來(lái)看看我們常用的幾種AlertDialog對(duì)話(huà)框。
1.彈出一個(gè)警告框,并有三個(gè)按鈕可選擇

我們來(lái)看看代碼部分:
button.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
// 通過(guò)AlertDialog.Builder這個(gè)類(lèi)來(lái)實(shí)例化我們的一個(gè)AlertDialog的對(duì)象
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
// 設(shè)置Title的圖標(biāo)
builder.setIcon(R.drawable.ic_launcher);
// 設(shè)置Title的內(nèi)容
builder.setTitle("彈出警告框");
// 設(shè)置Content來(lái)顯示一個(gè)信息
builder.setMessage("確定刪除嗎?");
// 設(shè)置一個(gè)PositiveButton
builder.setPositiveButton("確定", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
Toast.makeText(MainActivity.this, "positive: " + which, Toast.LENGTH_SHORT).show();
}
});
// 設(shè)置一個(gè)NegativeButton
builder.setNegativeButton("取消", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
Toast.makeText(MainActivity.this, "negative: " + which, Toast.LENGTH_SHORT).show();
}
});
// 設(shè)置一個(gè)NeutralButton
builder.setNeutralButton("忽略", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
Toast.makeText(MainActivity.this, "neutral: " + which, Toast.LENGTH_SHORT).show();
}
});
// 顯示出該對(duì)話(huà)框
builder.show();
}
});
我們?nèi)绻獎(jiǎng)?chuàng)建一個(gè)AlertDialog對(duì)話(huà)框,需要使用AlertDialog的一個(gè)內(nèi)部類(lèi),即AlertDialog.Builder來(lái)構(gòu)建一個(gè)AlertDialog的對(duì)話(huà)框,然后通過(guò)setXX方法來(lái)設(shè)置我們想要顯示的內(nèi)容即可。
我們看到,我們一共設(shè)置了3個(gè)action buttons,每一個(gè)button都為其綁定了一個(gè) DialogInterface.OnClickListener() 的監(jiān)聽(tīng)事件,然后在里面通過(guò)Toast吐司對(duì)話(huà)框(這個(gè)在后面隨筆中會(huì)講解)來(lái)彈出一下我們的一些信息,which方法表示的是action button所代表的int值:
positive: -1
negative: -2
neutral: -3
我們可以知道,which=-1就表示點(diǎn)擊的是確定按鈕,-2表示點(diǎn)擊的是取消按鈕,-3表示點(diǎn)擊的是忽略按鈕。
2.下拉列表彈出框

關(guān)鍵代碼如下:
button2.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View arg0)
{
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setIcon(R.drawable.ic_launcher);
builder.setTitle("選擇一個(gè)城市");
// 指定下拉列表的顯示數(shù)據(jù)
final String[] cities = {"廣州", "上海", "北京", "香港", "澳門(mén)"};
// 設(shè)置一個(gè)下拉的列表選擇項(xiàng)
builder.setItems(cities, new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
Toast.makeText(MainActivity.this, "選擇的城市為:" + cities[which], Toast.LENGTH_SHORT).show();
}
});
builder.show();
}
});
在這里我們通過(guò) setItems(CharSequence[] items, DialogInterface.OnClickListener listener) 方法來(lái)設(shè)置我們的一個(gè)下拉列表框。注意:因?yàn)橄吕斜砜蚧蛘呤窍吕噙x框這些都是顯示在Content中的,所以message和下拉列表框這些是不能夠同時(shí)存在的。
我們也可以給其綁定一個(gè)DialogInterface.OnClickListener監(jiān)聽(tīng)器,當(dāng)選中一個(gè)選項(xiàng)時(shí),對(duì)話(huà)框就會(huì)消失掉。這里的which代表的是下拉列表的每個(gè)選項(xiàng)的索引,通過(guò)這個(gè)我們可以輕松得到用戶(hù)選中的是哪一個(gè)選項(xiàng)。

3.彈出一個(gè)下拉單選框

button3.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setIcon(R.drawable.ic_launcher);
builder.setTitle("請(qǐng)選擇性別");
final String[] sex = {"男", "女", "未知性別"};
// 設(shè)置一個(gè)單項(xiàng)選擇下拉框
/**
* 第一個(gè)參數(shù)指定我們要顯示的一組下拉單選框的數(shù)據(jù)集合
* 第二個(gè)參數(shù)代表索引,指定默認(rèn)哪一個(gè)單選框被勾選上,1表示默認(rèn)'女' 會(huì)被勾選上
* 第三個(gè)參數(shù)給每一個(gè)單選項(xiàng)綁定一個(gè)監(jiān)聽(tīng)器
*/
builder.setSingleChoiceItems(sex, 1, new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
Toast.makeText(MainActivity.this, "性別為:" + sex[which], Toast.LENGTH_SHORT).show();
}
});
builder.setPositiveButton("確定", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
}
});
builder.show();
}
});
注意:在彈出下拉單選框時(shí),當(dāng)我們選中一個(gè)選項(xiàng),對(duì)話(huà)框是不會(huì)消失的,我們需要點(diǎn)擊action button才能讓對(duì)話(huà)框消失。

4.彈出一個(gè)下拉多選框

button4.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setIcon(R.drawable.ic_launcher);
builder.setTitle("愛(ài)好");
final String[] hobbies = {"籃球", "足球", "網(wǎng)球", "斯諾克"};
// 設(shè)置一個(gè)單項(xiàng)選擇下拉框
/**
* 第一個(gè)參數(shù)指定我們要顯示的一組下拉多選框的數(shù)據(jù)集合
* 第二個(gè)參數(shù)代表哪幾個(gè)選項(xiàng)被選擇,如果是null,則表示一個(gè)都不選擇,如果希望指定哪一個(gè)多選選項(xiàng)框被選擇,
* 需要傳遞一個(gè)boolean[]數(shù)組進(jìn)去,其長(zhǎng)度要和第一個(gè)參數(shù)的長(zhǎng)度相同,例如 {true, false, false, true};
* 第三個(gè)參數(shù)給每一個(gè)多選項(xiàng)綁定一個(gè)監(jiān)聽(tīng)器
*/
builder.setMultiChoiceItems(hobbies, null, new DialogInterface.OnMultiChoiceClickListener()
{
StringBuffer sb = new StringBuffer(100);
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked)
{
if(isChecked)
{
sb.append(hobbies[which] + ", ");
}
Toast.makeText(MainActivity.this, "愛(ài)好為:" + sb.toString(), Toast.LENGTH_SHORT).show();
}
});
builder.setPositiveButton("確定", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
}
});
builder.show();
}
});
我們看到在設(shè)置下拉多選框時(shí)使用的是setMultiChoiceItems方法,其各個(gè)參數(shù)的含義,在上面代碼中已經(jīng)闡述了。
同樣,對(duì)于下拉多選框,當(dāng)我們選中其中一個(gè)選項(xiàng)時(shí),對(duì)話(huà)框是不會(huì)消失的,只有點(diǎn)擊了action button才會(huì)消失。

5.自定義彈出對(duì)話(huà)框
對(duì)于自定義彈出對(duì)話(huà)框,我們就需要自己指定一個(gè)自定義的布局文件了,我們就給出一個(gè)最簡(jiǎn)單的輸入用戶(hù)名和密碼的兩個(gè)EditText:
dialog.xml
<?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" >
<EditText
android:id="@+id/username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="username"/>
<EditText
android:id="@+id/password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/username"
android:hint="password"
android:inputType="textPassword"/>
</RelativeLayout>

關(guān)鍵代碼:
button5.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setIcon(R.drawable.ic_launcher);
builder.setTitle("請(qǐng)輸入用戶(hù)名和密碼");
// 通過(guò)LayoutInflater來(lái)加載一個(gè)xml的布局文件作為一個(gè)View對(duì)象
View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.dialog, null);
// 設(shè)置我們自己定義的布局文件作為彈出框的Content
builder.setView(view);
final EditText username = (EditText)view.findViewById(R.id.username);
final EditText password = (EditText)view.findViewById(R.id.password);
builder.setPositiveButton("確定", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
String a = username.getText().toString().trim();
String b = password.getText().toString().trim();
// 將輸入的用戶(hù)名和密碼打印出來(lái)
Toast.makeText(MainActivity.this, "用戶(hù)名: " + a + ", 密碼: " + b, Toast.LENGTH_SHORT).show();
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
}
});
builder.show();
}
});
我們看到,通過(guò)自定義彈出框,我們首先需要寫(xiě)一個(gè)xml的布局文件,然后在里面定義我們的布局,我們不需要在布局文件里定義Button按鈕,可以通過(guò) AlertDialog.Builder 來(lái)設(shè)置 action buttons。
通過(guò) View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.dialog, null); 我們可以將我們的布局文件加載進(jìn)來(lái),得到一個(gè)View對(duì)象,然后通過(guò) AlertDialog.Builder 的setView方法來(lái)設(shè)置我們的自定義彈出框
總結(jié):到這里,基本上將AlertDialog詳細(xì)的講解完了,本篇隨筆主要講解了Dialog彈出框的基本概念以及詳細(xì)講解了AlertDialog這個(gè)彈出框,包括定義一個(gè)基本的彈出警告框、下拉列表框、下拉多選框等等。后續(xù)的隨筆將會(huì)繼續(xù)記錄學(xué)習(xí)Android的點(diǎn)點(diǎn)滴滴。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- android中ProgressDialog與ProgressBar的使用詳解
- Android中自定義對(duì)話(huà)框(Dialog)的實(shí)例代碼
- Android實(shí)現(xiàn)點(diǎn)擊AlertDialog上按鈕時(shí)不關(guān)閉對(duì)話(huà)框的方法
- Android開(kāi)發(fā)筆記之:Dialog的使用詳解
- 探討:你真的會(huì)用Android的Dialog嗎?
- Android ProgressBar進(jìn)度條和ProgressDialog進(jìn)度框的展示DEMO
- Android 去掉自定義dialog的白色邊框的簡(jiǎn)單方法
- Android Dialog 設(shè)置字體大小的具體方法
- Android入門(mén)之AlertDialog用法實(shí)例分析
- Android自定義ProgressDialog進(jìn)度等待框
- 實(shí)例詳解Android自定義ProgressDialog進(jìn)度條對(duì)話(huà)框的實(shí)現(xiàn)
- 淺析Android中強(qiáng)大的Dialog
相關(guān)文章
Android自定義View實(shí)現(xiàn)柱狀波形圖的繪制
柱狀波形圖是一種常見(jiàn)的圖形。一個(gè)個(gè)柱子按順序排列,構(gòu)成一個(gè)波形圖。本文將利用Android自定義View實(shí)現(xiàn)柱狀波形圖的繪制,需要的可以參考一下2022-08-08
Android利用WindowManager實(shí)現(xiàn)懸浮窗
這篇文章主要為大家詳細(xì)介紹了Android利用WindowManager實(shí)現(xiàn)懸浮窗效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
Android控件gridview實(shí)現(xiàn)單行多列橫向滾動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了Android控件gridview實(shí)現(xiàn)單行多列橫向滾動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
Android APP檢測(cè)實(shí)體按鍵事件詳解
這篇文章主要為大家詳細(xì)介紹了Android APP檢測(cè)實(shí)體按鍵事件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
Android開(kāi)發(fā)新手必須知道的10大嚴(yán)重錯(cuò)誤
這篇文章主要介紹了Android開(kāi)發(fā)新手必須知道的10大嚴(yán)重錯(cuò)誤,總結(jié)分析了Android開(kāi)發(fā)中幫助文件、開(kāi)發(fā)工具、社區(qū)等的重要性以及重要的開(kāi)發(fā)原則,需要的朋友可以參考下2016-01-01
Flutter狀態(tài)管理Bloc之定時(shí)器示例
這篇文章主要為大家詳細(xì)介紹了Flutter狀態(tài)管理Bloc之定時(shí)器示例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
android實(shí)現(xiàn)圖片上傳功能(springMvc)
這篇文章主要為大家詳細(xì)介紹了android結(jié)合springMvc實(shí)現(xiàn)圖片上傳的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
Android手勢(shì)操作簡(jiǎn)單實(shí)例講解
這篇文章主要為大家詳細(xì)介紹了Android手勢(shì)操作簡(jiǎn)單實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09

