前言
谷歌發(fā)布了 Material Design 設計之后钦扭,很多 Material 風格的控件也隨之加入到了 V7 兼容包中.
Android Support Library v22.1 中開始提供了 Material 風格的 Dialog 控件 剪验。
這為開發(fā)者提供了很好的支持,省去了使用開源庫或自己設計的煩惱。
下面我們來看看如何使用 Material 風格的 Dialog 饺鹃。
兼容的 AlertDialog
擁有Material風格的Dialog控件在下列類:
android.support.v7.app.AlertDialog
所以想要使用此風格的對話框彼水,需要在Module的build.gradle中導入
dependencies {
compile 'com.android.support:appcompat-v7:23.1.1'
}
這個 V7 包中的 AlertDialog 在 Android 2.1 以上可以提供兼容性的 Material 風格 Dialog 。
也就是說幸缕,使用這個包中的 AlertDialog 的話群发,從2.1到6.0都是 Material風格的 Dialog 晰韵。
當使用這個包中的 AlertDialog 時:
(下圖左邊為4.4,右邊為5.1)
非兼容的 AlertDialog
如果直接使用
android.app.AlertDialog
使用這個包中的 AlertDialog 的話 在 Android 5.0 以下就是原始風格熟妓, 5.0 以上為 Material 風格雪猪。
我們來看看對比圖:
(下圖左邊為4.4,右邊為5.1)
實例
在選擇導入包的時候決定了這個是否兼容低版本起愈,因為 Android 碎片化的原因只恨,推薦使用V7包中的AlertDialog達到高低版本統(tǒng)一樣式的效果。 這里用一個簡單的Demo樣式創(chuàng)建一個Dialog并顯示的過程抬虽。
/**
* 這是兼容的 AlertDialog
*/
private void showDialog() {
/*
這里使用了 android.support.v7.app.AlertDialog.Builder
可以直接在頭部寫 import android.support.v7.app.AlertDialog
那么下面就可以寫成 AlertDialog.Builder
*/
android.support.v7.app.AlertDialog.Builder builder = new android.support.v7.app.AlertDialog.Builder(this);
builder.setTitle("Material Design Dialog");
builder.setMessage("這是 android.support.v7.app.AlertDialog 中的樣式");
builder.setNegativeButton("取消", null);
builder.setPositiveButton("確定", null);
builder.show();
}
常用方法的解釋
通過Builder得到對象之后可以進行各種屬性的設置官觅,來看看都有哪些屬性可供調(diào)整。
show
進行顯示Dialog阐污。如果在未設置其他屬性的情況下直接使用show休涤,會顯示一個隱形Dialog,不過背景色會被透明黑色覆蓋笛辟。
setTitle
設置Dialog的標題功氨,使用一串文本或者。如:
builder.setTitle("這里是Title");
setMessage
設置Dialog的內(nèi)容手幢,使用一串文本捷凄。如:
builder.setMessage("這里是Message");
setNegativeButton
設置否定按鈕,第一個參數(shù)為按鈕文本弯菊,第二個參數(shù)為按鈕被點擊的監(jiān)聽器類纵势。如:
builder.setNegativeButton("取消", null);
setPositiveButton
設置肯定按鈕,第一個參數(shù)為按鈕文本管钳,第二個參數(shù)為按鈕被點擊的監(jiān)聽器類钦铁。如:
builder.setPositiveButton("確定", null);
谷歌使用這兩個方法來定義肯定和否定按鈕,一定程度上是為了統(tǒng)一肯定和否定按鈕所在的方向才漆,肯定按鈕統(tǒng)一在右邊牛曹,因為通常是右手操作,否定按鈕統(tǒng)一在左邊醇滥。這樣對用戶來說是比較統(tǒng)一的體驗黎比。
以上就是最為常用的幾個方法 , 接著往下看一些其他方法。
setNeutralButton
設置中性按鈕鸳玩,第一個參數(shù)為按鈕文本阅虫,第二個參數(shù)為按鈕被點擊的監(jiān)聽器類,這個按鈕默認被放置到Dialog的左下角不跟。如: builder.setNeutralButton("中性", null);
setView
設置一個自定義的View放置到message的下方颓帝,可以是一個View對象,也可以是一個view資源ID。 如:
builder.setView(new EditText(this));
setView(可設置邊距)
對于使用View對象的參數(shù)购城,還可以設置他的邊距吕座。 如:
builder.setView(new EditText(this),20,20,20,20);;
setMultiChoiceItems
第一個參數(shù)為列表項的文本數(shù)組,第二個參數(shù)為列表項默認情況下的選中狀態(tài)瘪板,為空則都不選中吴趴,第三個是列表項的監(jiān)聽器類。在使用這個方法的時候如果同時使用了setMessage方法會導致此方法無效侮攀,而只顯示setMessage的內(nèi)容锣枝。 如:
builder.setMultiChoiceItems(new String[]{"233333", "hahahaha"}, null, null);
setItems
第一個參數(shù)為列表項的文本數(shù)組,第二個參數(shù)為列表項的監(jiān)聽器類魏身。在使用這個方法的時候如果同時使用了setMessage方法會導致此方法無效惊橱,而只顯示setMessage的內(nèi)容蚪腐。 如:
builder.setItems(new String[]{"Item1", "Item2"}, null);
setIco
設置Dialog的圖標箭昵,可以使用資源文件 ID,也可以使用 Drawable 對象回季。 如: builder.setIcon(R.mipmap.ic_launcher);
自定義Dialog
有時候自帶的各種方法并不能滿足我們的Dialog的設計需求家制,這時候我們可以自己寫一個 xml 設計符合需求的Dialog。(僅為設計Dialog的Message部分泡一,并不是Dialog整體)
創(chuàng)建一個名為dialog的XML
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dialog"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<TextView
android:layout_margin="8dp"
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="你的銀行密碼:" />
<EditText
android:layout_margin="8dp"
android:id="@+id/et"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
創(chuàng)建View對象與XML關聯(lián)
LayoutInflater inflater = getLayoutInflater();
View dialog = inflater.inflate(R.layout.dialog,(ViewGroup) findViewById(R.id.dialog));
EditText editText = (EditText) dialog.findViewById(R.id.et);
將View設置到Dialog中
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("這里是Title");
builder.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, editText.getText().toString(), Toast.LENGTH_SHORT).show();
}
});
builder.setView(dialog);
builder.setIcon(R.mipmap.ic_launcher);
builder.show();