Android UI設(shè)計(jì)系列之自定義Dialog實(shí)現(xiàn)各種風(fēng)格的對話框效果(7)
雖然Android給我們提供了眾多組件,但是使用起來都不是很方便,我們開發(fā)的APK都有自己的風(fēng)格,如果使用了系統(tǒng)自帶的組件,總是覺得和應(yīng)用的主題不著邊際并且看起來也不順心,那我們就需要自定義了,為了方便大家對自定義組件的學(xué)習(xí),我接下來準(zhǔn)備了幾遍有關(guān)自定義的Dialog的文章,希望對大家有幫助。
在開發(fā)APK中最常見的估計(jì)就數(shù)彈出對話框了,這種對話框按照按鈕數(shù)量來分大致是三種:一個按鈕,兩個按鈕,三個按鈕。現(xiàn)在要講的就是按照按鈕數(shù)量分為以上三類吧(當(dāng)然了可以有更多的按鈕,只要你愿意)。
自定義Dialog對話大致可分為三步走吧:第一步就是重新定義Dialog的樣式,第二部就是定義我們需要顯示的布局文件,第三部就是設(shè)置事件監(jiān)聽器。
好了,還是老規(guī)矩,首先貼上工程目錄:

在工程中我定義了一個基類BaseBean,這個類用來作為在整個工程項(xiàng)目中的基類,基類中定義一些公共的常用的屬性,如有需要另外屬性我們只需要繼承基類就好了,所以我定義了DialogBean,它繼承了BaseBean,因此擁有了BaseBean的所有功能。那我們先看看BaseBean中定義的都是啥吧:
public class BaseBean {
/**
* 標(biāo)題
*/
String title;
/**
* 內(nèi)容
*/
String content;
/**
* 獲取標(biāo)題
*
* @return 標(biāo)題
*/
public String getTitle() {
return title;
}
/**
* 設(shè)置標(biāo)題
*
* @param title
* 標(biāo)題
*/
public void setTitle(String title) {
this.title = title;
}
/**
* 獲取內(nèi)容
*
* @return 內(nèi)容
*/
public String getContent() {
return content;
}
/**
* 設(shè)置內(nèi)容
*
* @param content
* 內(nèi)容
*/
public void setContent(String content) {
this.content = content;
}
}
以上是基類中的內(nèi)容,那接下來就看看Dialog中是怎么定義的吧:
public class DialogBean extends BaseBean {
/**
* 點(diǎn)擊返回鍵是否可消失
*/
boolean cancelable;
/**
* 點(diǎn)擊蒙皮是否可以消失
*/
boolean outCancelable;
/**
* 事件監(jiān)聽
*/
DialogClickListener listener;
/**
* 按鈕類型【默認(rèn)顯示兩個按鈕】
*/
DialogButtonType buttonType = DialogButtonType.TwoButton;
/**
* 顯示布局資源ID
*/
Integer layoutResID;
public DialogBean() {
}
/**
* 點(diǎn)擊BACK鍵是否可以消失
*
* @return 【true:可消失】【false:不消失】
*/
public boolean isCancelable() {
return cancelable;
}
/**
* 設(shè)置點(diǎn)擊BACK鍵是否可以消失
*
* @param cancelable
* 【true:可消失】【false:不消失】
*/
public void setCancelable(boolean cancelable) {
this.cancelable = cancelable;
}
/**
* 點(diǎn)擊蒙皮是否可以消失
*
* @return 【true:可消失】【false:不消失】
*/
public boolean isOutCancelable() {
return outCancelable;
}
/**
* 設(shè)置點(diǎn)擊蒙皮是否可以消失
*
* @param outCancelable
* 【true:可消失】【false:不消失】
*/
public void setOutCancelable(boolean outCancelable) {
this.outCancelable = outCancelable;
}
/**
* 獲取事件監(jiān)聽器
*
* @return 事件監(jiān)聽器
*/
public DialogClickListener getListener() {
return listener;
}
/**
* 設(shè)置事件監(jiān)聽器
*
* @param listener
* 事件監(jiān)聽器
*/
public void setListener(DialogClickListener listener) {
this.listener = listener;
}
/**
* 獲取按鈕類型
*
* @return 按鈕類型
*/
public DialogButtonType getButtonType() {
return buttonType;
}
/**
* 設(shè)置按鈕類型
*
* @param buttonType
* 按鈕類型
*/
public void setButtonType(DialogButtonType buttonType) {
this.buttonType = buttonType;
}
/**
* 獲取要顯示的布局ID
*
* @return 要顯示的布局ID
*/
public Integer getLayoutResID() {
return layoutResID;
}
/**
* 設(shè)置要顯示的布局ID
*
* @param layoutResID
* 要顯示的布局ID
*/
public void setLayoutResID(Integer layoutResID) {
this.layoutResID = layoutResID;
}
/**
* 按鈕類型
*
* @author llew
*/
public enum DialogButtonType {
/**
* 一個按鈕
*/
OneButton,
/**
* 兩個按鈕
*/
TwoButton,
/**
* 三個按鈕
*/
ThreeButton
}
/**
* 按鈕點(diǎn)擊監(jiān)聽器
*
* @author llew
*
*/
public interface DialogClickListener {
/**
* 點(diǎn)擊按鈕
*
* @param buttonIndex
* 按鈕下標(biāo)【從0開始】
*/
public void onClick(int buttonIndex);
}
}
DialogBean中的代碼注釋的都很詳細(xì)了,就不再多解釋了,主要就是封裝了對話框中常見的屬性。接下來就看看定義的所需要的Dialog的樣式吧:
<style name="theme_dialog_alert" parent="@android:style/Theme.Dialog">
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
</style>
樣式主要定義了該對話框沒有標(biāo)題,背景顏色是透明的,現(xiàn)在所需的樣式定義完了,主角GlobleDialog該出場了,代碼如下:
public class GlobleDialog extends Dialog implements View.OnClickListener {
private TextView titleTextView, contentTextView;
private Button leftButton, centerButton ,rightButton;
private DialogBean bean;
public GlobleDialog(Context context, int theme, DialogBean bean) {
super(context, theme);
this.bean = bean;
initWedgits();
}
/**
* 初始化各組件
*/
private void initWedgits() {
try {
setCancelable(bean.isCancelable());
setCanceledOnTouchOutside(bean.isOutCancelable());
View dialogView = getLayoutInflater().inflate(bean.getLayoutResID(), null);
titleTextView = (TextView) dialogView.findViewById(R.id.button_title);
contentTextView = (TextView) dialogView.findViewById(R.id.button_content);
titleTextView.setText(bean.getTitle());
contentTextView.setText(bean.getContent());
leftButton = (Button) dialogView.findViewById(R.id.button_left);
centerButton = (Button) dialogView.findViewById(R.id.button_center);
rightButton = (Button) dialogView.findViewById(R.id.button_right);
leftButton.setOnClickListener(this);
centerButton.setOnClickListener(this);
rightButton.setOnClickListener(this);
if(DialogButtonType.OneButton == bean.getButtonType()) {
leftButton.setVisibility(View.GONE);
rightButton.setVisibility(View.GONE);
} else if(DialogButtonType.TwoButton == bean.getButtonType()) {
centerButton.setVisibility(View.GONE);
}
setContentView(dialogView);
Window dialogWindow = getWindow();
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
dialogWindow.setGravity(Gravity.CENTER);
DisplayMetrics dm = new DisplayMetrics();
dialogWindow.getWindowManager().getDefaultDisplay().getMetrics(dm);
lp.width = dm.widthPixels - 20;
dialogWindow.setAttributes(lp);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onClick(View v) {
try {
switch (v.getId()) {
case R.id.button_left:
bean.getListener().onClick(0);
break;
case R.id.button_center:
bean.getListener().onClick(1);
break;
case R.id.button_right:
bean.getListener().onClick(2);
break;
default:
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
自定義的GlobleDialog的代碼寫完了,那就看看是如何使用的吧:
package com.llew.e.dialog.view.activity;
import android.app.Activity;
import android.app.Dialog;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
import android.widget.Toast;
import com.llew.e.dialog.R;
import com.llew.e.dialog.view.bean.DialogBean;
import com.llew.e.dialog.view.bean.DialogBean.DialogButtonType;
import com.llew.e.dialog.view.bean.DialogBean.DialogClickListener;
import com.llew.e.dialog.view.wedgit.GlobleDialog;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
private Dialog dialog;
private TextView textView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textView = (TextView) findViewById(R.id.textview);
textView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
DialogBean dialogBean = new DialogBean();
dialogBean.setCancelable(true);
dialogBean.setOutCancelable(true);
dialogBean.setTitle("小練習(xí)");
dialogBean.setContent("在這里輸入提示信息");
dialogBean.setButtonType(DialogButtonType.TwoButton);
dialogBean.setLayoutResID(R.layout.dialog_common);
dialogBean.setListener(new DialogClickListener() {
@Override
public void onClick(int buttonIndex) {
switch (buttonIndex) {
case 0:
Toast.makeText(MainActivity.this, "點(diǎn)擊了播放", Toast.LENGTH_SHORT).show();
break;
case 1:
Toast.makeText(MainActivity.this, "點(diǎn)擊了暫停", Toast.LENGTH_SHORT).show();
break;
case 2:
Toast.makeText(MainActivity.this, "點(diǎn)擊了停止", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
});
createDialog(dialogBean);
}
});
}
public void createDialog(DialogBean bean) {
if(null == dialog) {
dialog = new GlobleDialog(MainActivity.this, R.style.theme_dialog_alert, bean);
}
dialog.show();
}
}
代碼實(shí)在是沒有什么好解釋的,我相信你一看就會,那看看運(yùn)行效果吧:

界面看上去有點(diǎn)丑,大家可以自己修改顏色值或者使用圖片代替。
好了,到這里自定義Dialog實(shí)現(xiàn)不同風(fēng)格效果的對話框就講解完了,謝謝大家的閱讀。
源碼下載:Android UI設(shè)計(jì)實(shí)現(xiàn)各種風(fēng)格的對話框效果
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android中自定義對話框(Dialog)的實(shí)例代碼
- 實(shí)例詳解Android自定義ProgressDialog進(jìn)度條對話框的實(shí)現(xiàn)
- Android自定義對話框Dialog的簡單實(shí)現(xiàn)
- Android自定義Dialog實(shí)現(xiàn)加載對話框效果
- Android 自定義ProgressDialog進(jìn)度條對話框用法詳解
- Android使用setCustomTitle()方法自定義對話框標(biāo)題
- Android實(shí)現(xiàn)自定義圓角對話框Dialog的示例代碼
- 屬于自己的Android對話框(Dialog)自定義集合
- Android中制作自定義dialog對話框的實(shí)例分享
- android自定義帶箭頭對話框
相關(guān)文章
Android實(shí)現(xiàn)ImageView圖片雙擊放大及縮小
這篇文章主要介紹了Android實(shí)現(xiàn)ImageView圖片雙擊放大及縮小的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-02-02
Android使用addView動態(tài)添加組件的方法
這篇文章主要為大家詳細(xì)介紹了Android使用addView動態(tài)添加組件的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-09-09
Android中制作自定義dialog對話框的實(shí)例分享
這篇文章主要介紹了Android中制作自定義dialog對話框的實(shí)例分享,安卓自帶的Dialog顯然不夠用,因而我們要繼承Dialog類來制作自己的對話框,需要的朋友可以參考下2016-04-04
Android開發(fā)實(shí)現(xiàn)橫向列表GridView橫向滾動的方法【附源碼下載】
這篇文章主要介紹了Android開發(fā)實(shí)現(xiàn)橫向列表GridView橫向滾動的方法,結(jié)合實(shí)例形式分析了Android橫向列表GridView實(shí)現(xiàn)橫向滾動的相關(guān)布局與功能實(shí)現(xiàn)技巧,并附帶源碼供讀者下載參考,需要的朋友可以參考下2018-01-01
Android無需權(quán)限調(diào)起系統(tǒng)相機(jī)
在進(jìn)行一些小型APP的開發(fā),或者是對拍照界面沒有自定義要求時,我們可以用調(diào)起系統(tǒng)相機(jī)的方式快速完成拍照需求2023-03-03

