安卓Dialog彈窗詳解
阿新 • • 發佈:2018-12-21
樣式一:簡單對話方塊
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();
}
});
which表示的是action button所代表的int值,which=-1就表示點選的是確定按鈕,-2表示點選的是取消按鈕,-3表示點選的是忽略按鈕。 樣式二:列表對話方塊
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();
}
});
當選中一個選項時,對話方塊就會消失掉。這裡的which代表的是下拉列表的每個選項的索引,通過這個我們可以輕鬆得到使用者選中的是哪一個選項。 樣式三:單選對話方塊
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才會消失。
樣式五:內容部分自定義的對話方塊
<?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>
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();
}
});
樣式六:完全自定義的對話方塊
1,首先我們需要自定義Dialog的style,讓他自己本有的東西全部透明,然後在設定我們自己的內容就可以達到完全自定義的效果了
<!--對話方塊的樣式-->
<style name="NormalDialogStyle">
<!--對話方塊背景 -->
<item name="android:windowBackground">@android:color/transparent</item>
<!--邊框 -->
<item name="android:windowFrame">@null</item>
<!--沒有標題 -->
<item name="android:windowNoTitle">true</item>
<!-- 是否浮現在Activity之上 -->
<item name="android:windowIsFloating">true</item>
<!--背景透明 -->
<item name="android:windowIsTranslucent">false</item>
<!-- 是否有覆蓋 -->
<item name="android:windowContentOverlay">@null</item>
<!--進出的顯示動畫 -->
<item name="android:windowAnimationStyle">@style/normalDialogAnim</item>
<!--背景變暗-->
<item name="android:backgroundDimEnabled">true</item>
</style>
<!--對話方塊動畫-->
<style name="normalDialogAnim" parent="android:Animation">
<item name="@android:windowEnterAnimation">@anim/normal_dialog_enter</item>
<item name="@android:windowExitAnimation">@anim/normal_dialog_exit</item>
</style>
進入動畫:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromYDelta="100%"
android:toYDelta="0"
android:fillAfter="false"
android:duration="300"
/>
</set>
離開動畫:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromYDelta="0"
android:toYDelta="100%"
android:fillAfter="false"
android:duration="300"
/>
</set>
2,接下來就可以為對話方塊設定我們自定義的style了
/**
* 自定義對話方塊
*/
private void customDialog() {
final Dialog dialog = new Dialog(this, R.style.NormalDialogStyle);
View view = View.inflate(this, R.layout.dialog_normal, null);
TextView cancel = (TextView) view.findViewById(R.id.cancel);
TextView confirm = (TextView) view.findViewById(R.id.confirm);
// 設定自定義的佈局
dialog.setContentView(view);
//使得點選對話方塊外部不消失對話方塊
dialog.setCanceledOnTouchOutside(true);
//設定對話方塊的大小
view.setMinimumHeight((int) (ScreenSizeUtils.getInstance(this).getScreenHeight() * 0.23f));
Window dialogWindow = dialog.getWindow();
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
lp.width = (int) (ScreenSizeUtils.getInstance(this).getScreenWidth() * 0.75f);
lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
lp.gravity = Gravity.CENTER;
dialogWindow.setAttributes(lp);
cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
confirm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
dialog.show();
}
將Dialog放置在螢幕中間lp.gravity = Gravity.CENTER;並設定他的寬度為螢幕的75%lp.width = (int) (ScreenSizeUtils.getInstance(this).getScreenWidth() * 0.75f); 3,這裡使用到了一個工具類用來計算手機螢幕的寬高,如下程式碼:
public class ScreenSizeUtils {
private static ScreenSizeUtils instance = null;
private int screenWidth, screenHeight;
public static ScreenSizeUtils getInstance(Context mContext) {
if (instance == null) {
synchronized (ScreenSizeUt