編輯:關於Android編程
在Android開發當中,在界面上彈出一個Dialog對話框使我們經常需要做的,本篇隨筆將詳細的講解Dialog對話框這個概念,包括定義不同樣式的對話框。
一、Dialog
我們首先來看看android官方文檔對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就是一個在屏幕上彈出一個可以讓用戶做出一個選擇,或者輸入額外的信息的對話框,一個對話框並不會沾滿我們整個的屏幕,並且通常用於模型事件當中需要用戶做出一個決定後才會繼續執行。
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
今天我們重點要來了解的就是AlertDialog對話框,我們看到,AlertDialog是Dialog的一個直接子類。
使用AlertDialog,我們可以顯示一個標題,最多3個按鈕操作,以及一組選擇框或者是自己定義的彈出框。
這裡借用android的官方文檔提供的一個圖來看看AlertDialog框的組成:
①區域1那裡就是定義彈出框的頭部信息,包括標題名或者是一個圖標。<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPqLax/jT8jLEx8DvysdBbGVydERpYWxvZ7bUu7C/8rXEY29udGVudLK/t9ajrNTa1eLA787Sw8e/ydLUyejWw9K70KltZXNzYWdl0MXPoqOsu/LV38rHtqjS5dK71+nRodTxv/KjrLu5v8nS1Lao0uXO0sPH19S8urXEsry+1rWvs/a/8qGjPC9wPg0KPHA+otvH+NPyM8THwO/Kuc7Sw8e1xEFjdGlvbiBCdXR0b25zsr+31qOs1eLA787Sw8e/ydLUtqjS5c7Sw8e1xLLZ1/ewtMWloaM8L3A+DQo8cD7LtbW9QWN0aW9uIEJ1dHRvbnPV4sDv0qrM2LHw16LS4tK7z8KjujwvcD4NCjxwPtTaQWxlcnREaWFsb2fW0KOstqjS5bC0xaW2vMrHzai5/SBzZXRYWFhCdXR0b24gt723qMC0zeqzyaOsxuTW0NK7ubLT0DPW1rK7zay1xEFjdGlvbiBCdXR0b25zuanO0sPH0aHU8aO6PC9wPg0KPHByZSBjbGFzcz0="brush:java;">
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.彈出一個警告框,並有三個按鈕可選擇
我們來看看代碼部分:
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表示點擊的是忽略按鈕。
2.下拉列表彈出框
關鍵代碼如下:
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("選擇一個城市");
// 指定下拉列表的顯示數據
final String[] cities = {"廣州", "上海", "北京", "香港", "澳門"};
// 設置一個下拉的列表選擇項
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();
}
});
在這裡我們通過 setItems(CharSequence[] items, DialogInterface.OnClickListener listener) 方法來設置我們的一個下拉列表框。注意:因為下拉列表框或者是下拉多選框這些都是顯示在Content中的,所以message和下拉列表框這些是不能夠同時存在的。
我們也可以給其綁定一個DialogInterface.OnClickListener監聽器,當選中一個選項時,對話框就會消失掉。這裡的which代表的是下拉列表的每個選項的索引,通過這個我們可以輕松得到用戶選中的是哪一個選項。
3.彈出一個下拉單選框
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才能讓對話框消失。
4.彈出一個下拉多選框
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();
}
});
我們看到在設置下拉多選框時使用的是setMultiChoiceItems方法,其各個參數的含義,在上面代碼中已經闡述了。
同樣,對於下拉多選框,當我們選中其中一個選項時,對話框是不會消失的,只有點擊了action button才會消失。
5.自定義彈出對話框
對於自定義彈出對話框,我們就需要自己指定一個自定義的布局文件了,我們就給出一個最簡單的輸入用戶名和密碼的兩個EditText:
dialog.xml
關鍵代碼:
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("請輸入用戶名和密碼");
// 通過LayoutInflater來加載一個xml的布局文件作為一個View對象
View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.dialog, null);
// 設置我們自己定義的布局文件作為彈出框的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();
// 將輸入的用戶名和密碼打印出來
Toast.makeText(MainActivity.this, "用戶名: " + a + ", 密碼: " + b, Toast.LENGTH_SHORT).show();
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
}
});
builder.show();
}
});
我們看到,通過自定義彈出框,我們首先需要寫一個xml的布局文件,然後在裡面定義我們的布局,我們不需要在布局文件裡定義Button按鈕,可以通過 AlertDialog.Builder 來設置 action buttons。
通過 View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.dialog, null); 我們可以將我們的布局文件加載進來,得到一個View對象,然後通過 AlertDialog.Builder 的setView方法來設置我們的自定義彈出框
就是仿照現在掃一掃的形式,周圍是半透明的遮擋,然後中間是全透明的,拍攝後只截取框內的內容查了很多博客,實現起來真的太復雜了,本人比較怕麻煩所以在很多地方偷懶了先上效果圖:
最近在網上看到時間軸的布局效果,嘗試按照這個原理,實現物流跟蹤的效果,目前已經實現了,效果如下圖。 界面布局主要是通過listView來
PullToRefresh是一套實現非常好的下拉刷新庫,它支持: ListView ExpandableListView GridView WebView ScrollV
Service分為兩種工作狀態,一種是啟動狀態,主要用於執行後台計算;另一種是綁定狀態,主要用於其他組件和Service的交互。這兩種狀態可以共存的,即Service既可