版權聲明:本文為部落客原創文章,轉載請标明出處。 https://blog.csdn.net/chaoyu168/article/details/50753095
在Android開發當中,在界面上彈出一個Dialog對話框使我們經常需要做的,本篇做一下記錄,以備遺忘時查詢。
dialog就是一個在螢幕上彈出一個可以讓使用者做出一個選擇,或者輸入額外的資訊的對話框,一個對話框并不會沾滿我們整個的螢幕,并且通常用于模型事件當中需要使用者做出一個決定後才會繼續執行。
Dialog類是dialog對話框的基類,但是我們應該避免直接使用這個類來執行個體化一個dialog對話框,我們應當使用其子類來得到一個對話框:
java.lang.Object
android.app.Dialog
Known Direct Subclasses
AlertDialog, CharacterPickerDialog, MediaRouteChooserDialog, MediaRouteControllerDialog, Presentation
Known Indirect Subclasses
DatePickerDialog, ProgressDialog, TimePickerDialog
我們看到,Dialog有很多的子類實作,是以我們要定義一個對話框,使用其子類來執行個體化一個即可,而不要直接使用Dialog這個父類來構造。
我們看到,AlertDialog是Dialog的一個直接子類。
使用AlertDialog,我們可以顯示一個标題,最多3個按鈕操作,以及一組選擇框或者是自己定義的彈出框。
在AlertDialog中,定義按鈕都是通過
setXXXButton 方法來完成,其中一共有3種不同的Action Buttons供我們選擇:
1.setPositiveButton(CharSequence text, DialogInterface.OnClickListener listener)
這是一個相當于OK、确定操作的按鈕,
2.setNegativeButton (CharSequence text, DialogInterface.OnClickListener listener)
這是一個相當于取消操作的按鈕。
3. setNeutralButton (CharSequence text, DialogInterface.OnClickListener listener)
這個是相當于一個忽略操作的按鈕。
我們每一種action buttons最多隻能出現一個,即彈出對話框最多隻能出現一個PositiveButton。
接下來我們通過一個一個的具體執行個體來看看我們常用的幾種AlertDialog對話框。
1.彈出一個警告框,并有三個按鈕可選擇
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicGcq5yM1AzYlRGMwITZjNDN1MWYyQWO0cTN3IGZ2QjM5czY00iMyIzM0EjMx8CXxEzMxAjMvwVM0QjMzQzLcd2bsJ2Lc12bj5yZvxmY0lmbj5ycldWYtl2Lc9CX6MHc0RHaiojIsJye.jpg)
我們來看看代碼部分:
button.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
// 通過AlertDialog.Builder這個類來執行個體化我們的一個AlertDialog的對象
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
// 設定Title的圖示
builder.setIcon(R.drawable.ic_launcher);
// 設定Title的内容
builder.setTitle("彈出警告框");
// 設定Content來顯示一個資訊
builder.setMessage("确定删除嗎?");
// 設定一個PositiveButton
builder.setPositiveButton("确定", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
Toast.makeText(MainActivity.this, "positive: " + which, Toast.LENGTH_SHORT).show();
}
});
// 設定一個NegativeButton
builder.setNegativeButton("取消", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
Toast.makeText(MainActivity.this, "negative: " + which, Toast.LENGTH_SHORT).show();
}
});
// 設定一個NeutralButton
builder.setNeutralButton("忽略", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
Toast.makeText(MainActivity.this, "neutral: " + which, Toast.LENGTH_SHORT).show();
}
});
// 顯示出該對話框
builder.show();
}
});
我們如果要建立一個AlertDialog對話框,需要使用AlertDialog的一個内部類,即AlertDialog.Builder來建構一個AlertDialog的對話框,然後通過setXX方法來設定我們想要顯示的内容即可。
我們看到,我們一共設定了3個action buttons,每一個button都為其綁定了一個 DialogInterface.OnClickListener() 的監聽事件,然後在裡面通過Toast吐司對話框(這個在後面随筆中會講解)來彈出一下我們的一些資訊,which方法表示的是action button所代表的int值:
positive: -1
negative: -2
neutral: -3
我們可以知道,which=-1就表示點選的是确定按鈕,-2表示點選的是取消按鈕,-3表示點選的是忽略按鈕。
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class SingleChoiceItemsTest extends Activity implements OnClickListener
{
private String[] province = new String[] { "上海", "北京", "湖南", "湖北", "海南" };
private Button btnSingleChoiceList;
// 單擊事件對象的執行個體
private ButtonOnClick buttonOnClick = new ButtonOnClick(1);
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnSingleChoiceList = (Button) findViewById(R.id.btnSingleChoice);
btnSingleChoiceList.setOnClickListener(this);
}
@Override
public void onClick(View v)
{
showSingleChoiceButton();
}
// 在單選選項中顯示 确定和取消按鈕
//buttonOnClickg變量的資料類型是ButtonOnClick,一個單擊事件類
private void showSingleChoiceButton()
{
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("請選擇省份");
builder.setSingleChoiceItems(province, 0, buttonOnClick);
builder.setPositiveButton("确定", buttonOnClick);
builder.setNegativeButton("取消", buttonOnClick);
builder.show();
}
private class ButtonOnClick implements DialogInterface.OnClickListener
{
private int index; // 表示選項的索引
public ButtonOnClick(int index)
{
this.index = index;
}
@Override
public void onClick(DialogInterface dialog, int which)
{
// which表示單擊的按鈕索引,所有的選項索引都是大于0,按鈕索引都是小于0的。
if (which >= 0)
{
//如果單擊的是清單項,将目前清單項的索引儲存在index中。
//如果想單擊清單項後關閉對話框,可在此處調用dialog.cancel()
//或是用dialog.dismiss()方法。
index = which;
}
else
{
//使用者單擊的是【确定】按鈕
if (which == DialogInterface.BUTTON_POSITIVE)
{
//顯示使用者選擇的是第幾個清單項。
final AlertDialog ad = new AlertDialog.Builder(
SingleChoiceItemsTest.this).setMessage(
"你選擇的地區是:" + index + ":" + province[index]).show();
//五秒鐘後自動關閉。
Handler hander = new Handler();
Runnable runnable = new Runnable()
{
@Override
public void run()
{
ad.dismiss();
}
};
hander.postDelayed(runnable, 5 * 1000);
}
//使用者單擊的是【取消】按鈕
else if (which == DialogInterface.BUTTON_NEGATIVE)
{
Toast.makeText(SingleChoiceItemsTest.this, "你沒有選擇任何東西",
Toast.LENGTH_LONG);
}
}
}
}
}
彈出一個下拉單選框
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("請選擇性别");
final String[] sex = {"男", "女", "未知性别"};
// 設定一個單項選擇下拉框
/**
* 第一個參數指定我們要顯示的一組下拉單選框的資料集合
* 第二個參數代表索引,指定預設哪一個單選框被勾選上,1表示預設'女' 會被勾選上
* 第三個參數給每一個單選項綁定一個監聽器
*/
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();
}
});
注意:在彈出下拉單選框時,當我們選中一個選項,對話框是不會消失的,我們需要點選action
button才能讓對話框消失。
彈出一個下拉多選框
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("愛好");
final String[] hobbies = {"籃球", "足球", "網球", "斯諾克"};
// 設定一個單項選擇下拉框
/**
* 第一個參數指定我們要顯示的一組下拉多選框的資料集合
* 第二個參數代表哪幾個選項被選擇,如果是null,則表示一個都不選擇,如果希望指定哪一個多選選項框被選擇,
* 需要傳遞一個boolean[]數組進去,其長度要和第一個參數的長度相同,例如 {true, false, false, true};
* 第三個參數給每一個多選項綁定一個監聽器
*/
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, "愛好為:" + 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();
}
});
同樣,對于下拉多選框,當我們選中其中一個選項時,對話框是不會消失的,隻有點選了action button才會消失。