|
自定义Android 对话框(AlertDialog) 的样式 |
|
|
自定义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">
根节点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
|
|
|
|
|
|
|
|
|
|
|