配色: 字号:
自定义Android 对话框(AlertDialog) 的样式
2016-10-26 | 阅:  转:  |  分享 
  
自定义Android对话框(AlertDialog)的样式

Android提供了AlertDialog类可通过其内部类Builder轻松创建对话框窗口,但是没法对这个对话框窗口进行定制,为了修改AlertDialog窗口显示的外观,解决的办法就是创建一个指定的AlertDialog和AlertDialog.Builder类。



AndroiddefaultDialog



定义外观

我们希望将上面默认的对话框外观修改为如下图所示的新对话框风格:



CustomAndroidDialog



该对话框将支持下面特性:



可从资源或者字符串直接指定对话框标题

可从资源、字符串和自定义布局来设置对话框内容

可设置按钮和相应的事件处理

编写布局、样式和主题

该对话框使用一个定制的布局来输出内容,布局定义的id将用于访问标题TextView,下面是定义文件:








android:orientation="vertical"

android:layout_width="fill_parent"

android:minWidth="280dip"

android:layout_height="wrap_content">






android:orientation="vertical"

android:background="@drawable/header"

android:layout_width="fill_parent"

android:layout_height="wrap_content">




style="@style/DialogText.Title"



android:id="@+id/title"

android:paddingRight="8dip"

android:paddingLeft="8dip"

android:background="@drawable/title"

android:layout_width="wrap_content"



android:layout_height="wrap_content"/>








android:id="@+id/content"

android:orientation="vertical"

android:background="@drawable/center"



android:layout_width="fill_parent"

android:layout_height="wrap_content">




style="@style/DialogText"

android:id="@+id/message"

android:padding="5dip"



android:layout_width="fill_parent"

android:layout_height="wrap_content"/>








android:orientation="horizontal"

android:background="@drawable/footer"



android:layout_width="fill_parent"

android:layout_height="wrap_content">




android:id="@+id/positiveButton"

android:layout_marginTop="3dip"

android:layout_width="0dip"



android:layout_weight="1"

android:layout_height="wrap_content"

android:singleLine="true"/>




android:id="@+id/negativeButton"



android:layout_marginTop="3dip"

android:layout_width="0dip"

android:layout_weight="1"

android:layout_height="wrap_content"

android:singleLine="true"/>











根节点LinearLayout的宽度设置为fill_parent而最小的宽度是280dip,因此对话框的宽度将始终为屏幕宽度的87.5%



自定义的主题用于声明对话框是浮动的,而且使用自定义的背景和标题视图:











@null



true

true







接下来我们需要定义对话框的标题和消息的显示:











#FF000000



12sp







16sp



bold







编写对话框和Builder类

最好我们要提供跟AletDialog.Builder类一样的方法:



packagenet.androgames.blog.sample.customdialog.dialog;



importnet.androgames.blog.sample.customdialog.R;

importandroid.app.Dialog;

importandroid.content.Context;

importandroid.content.DialogInterface;

importandroid.view.LayoutInflater;

importandroid.view.View;

importandroid.view.ViewGroup.LayoutParams;

importandroid.widget.Button;

importandroid.widget.LinearLayout;

importandroid.widget.TextView;



/



CreatecustomDialogwindowsforyourapplication

Customdialogsrelyoncustomlayoutswichallowyouto

createanduseyourownlook&feel.



UnderGPLv3:http://www.gnu.org/licenses/gpl-3.0.html



@authorantoinevianey



/

publicclassCustomDialogextendsDialog{



publicCustomDialog(Contextcontext,inttheme){

super(context,theme);

}



publicCustomDialog(Contextcontext){

super(context);

}



/

Helperclassforcreatingacustomdialog

/

publicstaticclassBuilder{



privateContextcontext;

privateStringtitle;

privateStringmessage;

privateStringpositiveButtonText;

privateStringnegativeButtonText;

privateViewcontentView;



privateDialogInterface.OnClickListener

positiveButtonClickListener,

negativeButtonClickListener;



publicBuilder(Contextcontext){

this.context=context;

}



/

SettheDialogmessagefromString

@paramtitle

@return

/

publicBuildersetMessage(Stringmessage){

this.message=message;

returnthis;

}



/

SettheDialogmessagefromresource

@paramtitle

@return

/

publicBuildersetMessage(intmessage){

this.message=(String)context.getText(message);

returnthis;

}



/

SettheDialogtitlefromresource

@paramtitle

@return

/

publicBuildersetTitle(inttitle){

this.title=(String)context.getText(title);

returnthis;

}



/

SettheDialogtitlefromString

@paramtitle

@return

/

publicBuildersetTitle(Stringtitle){

this.title=title;

returnthis;

}



/

SetacustomcontentviewfortheDialog.

Ifamessageisset,thecontentViewisnot

addedtotheDialog...

@paramv

@return

/

publicBuildersetContentView(Viewv){

this.contentView=v;

returnthis;

}



/

Setthepositivebuttonresourceandit''slistener

@parampositiveButtonText

@paramlistener

@return

/

publicBuildersetPositiveButton(intpositiveButtonText,

DialogInterface.OnClickListenerlistener){

this.positiveButtonText=(String)context

.getText(positiveButtonText);

this.positiveButtonClickListener=listener;

returnthis;

}



/

Setthepositivebuttontextandit''slistener

@parampositiveButtonText

@paramlistener

@return

/

publicBuildersetPositiveButton(StringpositiveButtonText,

DialogInterface.OnClickListenerlistener){

this.positiveButtonText=positiveButtonText;

this.positiveButtonClickListener=listener;

returnthis;

}



/

Setthenegativebuttonresourceandit''slistener

@paramnegativeButtonText

@paramlistener

@return

/

publicBuildersetNegativeButton(intnegativeButtonText,

DialogInterface.OnClickListenerlistener){

this.negativeButtonText=(String)context

.getText(negativeButtonText);

this.negativeButtonClickListener=listener;

returnthis;

}



/

Setthenegativebuttontextandit''slistener

@paramnegativeButtonText

@paramlistener

@return

/

publicBuildersetNegativeButton(StringnegativeButtonText,

DialogInterface.OnClicwww.baiyuewang.netkListenerlistener){

this.negativeButtonText=negativeButtonText;

this.negativeButtonClickListener=listener;

returnthis;

}



/

Createthecustomdialog

/

publicCustomDialogcreate(){

LayoutInflaterinflater=(LayoutInflater)context

getSystemService(Context.LAYOUT_INFLATER_SERVICE);

//instantiatethedialogwiththecustomTheme

finalCustomDialogdialog=newCustomDialog(context,

R.style.Dialog);

Viewlayout=inflater.inflate(R.layout.dialog,null);

dialog.addContentView(layout,newLayoutParams(

LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));

//setthedialogtitle

((TextView)layout.findViewById(R.id.title)).setText(title);

//settheconfirmbutton

if(positiveButtonText!=null){

((Button)layout.findViewById(R.id.positiveButton))

.setText(positiveButtonText);

if(positiveButtonClickListener!=null){

((Button)layout.findViewById(R.id.positiveButton))

.setOnClickListener(newView.OnClickListener(){

publicvoidonClick(Viewv){

positiveButtonClickListener.onClick(

dialog,

DialogInterface.BUTTON_POSITIVE);

}

});

}

}else{

//ifnoconfirmbuttonjustsetthevisibilitytoGONE

layout.findViewById(R.id.positiveButton).setVisibility(

View.GONE);

}

//setthecancelbutton

if(negativeButtonText!=null){

((Button)layout.findViewById(R.id.negativeButton))

.setText(negativeButtonText);

if(negativeButtonClicwww.wang027.comkListener!=null){

((Button)layout.findViewById(R.id.negativeButton))

.setOnClickListener(newView.OnClickListener(){

publicvoidonClick(Viewv){

positiveButtonClickListener.onClick(

dialog,

DialogInterface.BUTTON_NEGATIVE);

}

});

}

}else{

//ifnoconfirmbuttonjustsetthevisibilitytoGONE

layout.findViewById(R.id.negativeButton).setVisibility(

View.GONE);

}

//setthecontentmessage

if(message!=null){

((TextView)layout.findViewById(

R.id.message)).setText(message);

}elseif(contentView!=null){

//ifnomessageset

//addthecontentViewtothedialogbody

((LinearLayout)layout.findViewById(R.id.content))

.removeAllViews();

((LinearLayout)layout.findViewById(R.id.content))

.addView(contentView,

newLayoutParams(

LayoutParams.WRAP_CONTENT,

LayoutParams.WRAP_CONTENT));

}

dialog.setContentView(layout);

returndialog;

}



}



}

使用自定义的Builder

使用方法很简单:



/

BuildthedesiredDialog

CUSTOMorDEFAULT

/

@Override

publicDialogonCreateDialog(intdialogId){

Dialogdialog=null;

switch(dialogId){

caseCUSTOM_DIALOG:

CustomDialog.BuildercustomBuilder=new

CustomDialog.Builder(CustomDialogActivity.this);

customBuilder.setTitle("Customtitle")

.setMessage("Custombody")

.setNegativeButton("Cancel",

newDialogInterface.OnClickListener(){

publicvoidonClick(DialogInterfacedialog,intwhich){

CustomDialogActivity.this

.dismissDialog(CUSTOM_DIALOG);

}

})

.setPositiveButton("Confirm",

newDialogInterface.OnClickListener(){

publicvoidonClick(DialogInterfacedialog,intwhich){

dialog.dismiss();

}

});

dialog=customBuilder.create();

break;

caseDEFAULT_DIALOG:

AlertDialog.BuilderalertBuilder=new

AlertDialog.Builder(CustomDialogActivity.this);

alertBuilder.setTitle("Defaulttitle")

.setMessage("Defaultbody")

.setNegativeButton("Cancel",

newDialogInterface.OnClickListener(){

publicvoidonClick(DialogInterfacedialog,intwhich){

dialog.dismiss();

}

})

.setPositiveButton("Confirm",

newDialogInterface.OnClickListener(){

publicvoidonClick(DialogInterfacedialog,intwhich){

CustomDialogActivity.this

.dismissDialog(DEFAULT_DIALOG);

}

});

dialog=alertBuilder.create();

break;

}

returndialog;

}

完整的代码下载:S

献花(0)
+1
(本文系thedust79首藏)