Android系統提供了幾種默認的Dialog樣式,用來固定顯示某一類內容,但在實際開發中常常需要展示很多不屬於這些固定樣式的內容,這個時候我們可以通過自定義Dialog的方式來實現,具體步驟如下:
1. 設置Dialog的風格主題(styles.xml)
<!--自定義dialog背景全透明無邊框theme -->
<style name="MyDialog" parent="android:style/Theme.Dialog">
<!--背景顏色及和透明程度-->
<item name="android:windowBackground">@android:color/transparent</item>
<!--是否去除標題 -->
<item name="android:windowNoTitle">true</item>
<!--是否去除邊框-->
<item name="android:windowFrame">@null</item>
<!--是否浮現在activity之上-->
<item name="android:windowIsFloating">true</item>
<!--背景是否變暗-->
<item name="android:backgroundDimEnabled">true</item>
</style>
2. 自定義背景框,下面是一個圓角矩形背景
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<solid android:color="#ffffff" />
<stroke
android:width="0.8dp"
android:color="#ffffff" />
<!-- 圓角 -->
<corners android:radius="6dp" />
</shape>
3. 設置自定義的展示界面(layout),這里簡單的展示了一個textview,可以添加任意布局
<?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"
android:background="#11ffffff">
<LinearLayout
android:layout_width="260dp"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:background="@drawable/dialog_bg"
android:orientation="vertical">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="15dp"
android:gravity="center"
android:text="消息提示"
android:textColor="#38ADFF"
android:textSize="18sp" />
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="#E4E4E4" />
<TextView
android:id="@+id/message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="10dp"
android:layout_gravity="center"
android:textColor="#000"
android:textSize="16sp"
android:text="提示消息" />
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:layout_marginTop="15dp"
android:background="#E4E4E4" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="45dp"
android:orientation="horizontal">
<Button
android:id="@+id/no"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginStart="10dp"
android:layout_weight="1"
android:background="@null"
android:gravity="center"
android:singleLine="true"
android:text="取消"
android:textColor="#7D7D7D"
android:textSize="17sp" />
<View
android:layout_width="1px"
android:layout_height="match_parent"
android:background="#E4E4E4" />
<Button
android:id="@+id/yes"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginEnd="10dp"
android:layout_weight="1"
android:background="@null"
android:gravity="center"
android:singleLine="true"
android:text="確定"
android:textColor="#38ADFF"
android:textSize="17sp" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>
4. 實現自定義Dialog類
public class MyDialog extends Dialog {
private Button yes;//確定按鈕
private Button no;//取消按鈕
private TextView titleView;
private TextView messageView;
private String title;
private String message;
private onYesOnclickListener yesOnclickListener;//確定按鈕被點擊了的監聽器
private onNoOnclickListener noOnclickListener;//取消按鈕被點擊了的監聽器
public MyDialog(Context context, int themeResId) {
super(context, themeResId);
}
// 設置確定按鈕監聽
public void setYesOnclickListener(onYesOnclickListener yesOnclickListener) {
this.yesOnclickListener = yesOnclickListener;
}
// 設置取消按鈕監聽
public void setNoOnclickListener(onNoOnclickListener noOnclickListener) {
this.noOnclickListener = noOnclickListener;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_dialog);
//初始化界面控件
initView();
//初始化界面數據
initData();
//初始化界面控件的事件
initEvent();
}
// 初始化界面控件
private void initView() {
yes = findViewById(R.id.yes);
no = findViewById(R.id.no);
titleView = findViewById(R.id.title);
messageView = findViewById(R.id.message);
}
// 初始化界面控件的顯示數據
private void initData() {
if (title != null) {
titleView.setText(title);
}
if (message != null) {
messageView.setText(message);
}
}
// 初始化界面的確定和取消按鈕監聽
private void initEvent() {
//設置確定按鈕被點擊后,向外界提供監聽
yes.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (yesOnclickListener != null) {
yesOnclickListener.onYesOnclick();
}
}
});
//設置取消按鈕被點擊后,向外界提供監聽
no.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (noOnclickListener != null) {
noOnclickListener.onNoOnclick();
}
}
});
}
// 設置標題
public void setTitle(String title) {
this.title = title;
}
// 設置消息
public void setMessage(String message) {
this.message = message;
}
public interface onYesOnclickListener {
public void onYesOnclick();
}
public interface onNoOnclickListener {
public void onNoOnclick();
}
}
5. 在活動中使用
final MyDialog dialog = new MyDialog(MainActivity.this, R.style.MyDialog);
dialog.setTitle("MyDialog");
dialog.setMessage("hello world");
dialog.setYesOnclickListener(new MyDialog.onYesOnclickListener() {
@Override
public void onYesOnclick() {
dialog.dismiss();
}
});
dialog.setNoOnclickListener(new MyDialog.onNoOnclickListener() {
@Override
public void onNoOnclick() {
dialog.dismiss();
}
});
dialog.show();
效果如下: