2023年7月15日发(作者:)
Android 提供了 AlertDialog 类可通过其内部类 Builder 轻松创建对话框窗口,但是没法对这个对话框窗口进行定制,为了修改 AlertDialog 窗口显示的外观,解决的办法就是创建一个指定的 AlertDialog 和 r 类。
定义外观
我们希望将上面默认的对话框外观修改为如下图所示的新对话框风格:
该对话框将支持下面特性:
1. 可从资源或者字符串直接指定对话框标题
2. 可从资源、字符串和自定义布局来设置对话框内容
3. 可设置按钮和相应的事件处理
编写布局、样式和主题
该对话框使用一个定制的布局来输出内容,布局定义的id将用于访问标题 TextView,下面是定义文件:
xmlns:android="/apk/res/android" 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/" 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%
自定义的主题用于声明对话框是浮动的,而且使用自定义的背景和标题视图:
接下来我们需要定义对话框的标题和消息的显示:
编写对话框和 Builder 类
最好我们要提供跟 r 类一样的方法:
package ;
import dialog.R;
import ;
import t;
import Interface;
import Inflater;
import ;
import Params;
import ;
import Layout;
import ew;
/**
*
* Create custom Dialog windows for your application
* Custom dialogs rely on custom layouts wich allow you to
* create and use your own look & feel.
*
* Under GPL v3 : /licenses/
*
* @author antoine vianey
*
*/
public class CustomDialog extends Dialog {
public CustomDialog(Context context, int theme) {
super(context, theme);
}
public CustomDialog(Context context) {
super(context);
}
/**
* Helper class for creating a custom dialog
*/
public static class Builder {
private Context context;
private String title;
private String message;
private String positiveButtonText;
private String negativeButtonText;
private View contentView;
private kListener
positiveButtonClickListener,
negativeButtonClickListener;
public Builder(Context context) {
t = context;
}
/**
* Set the Dialog message from String
* @param title
* @return
*/
public Builder setMessage(String message) {
e = message;
return this;
}
/**
* Set the Dialog message from resource
* @param title
* @return
*/
public Builder setMessage(int message) { e = (String) t(message);
return this;
}
/**
* Set the Dialog title from resource
* @param title
* @return
*/
public Builder setTitle(int title) {
= (String) t(title);
return this;
}
/**
* Set the Dialog title from String
* @param title
* @return
*/
public Builder setTitle(String title) {
= title;
return this;
}
/**
* Set a custom content view for the Dialog.
* If a message is set, the contentView is not
* added to
* @param v
* @return
*/
public Builder setContentView(View v) {
tView = v;
return this;
}
/**
* Set the positive button resource and it's listener
* @param positiveButtonText
* @param listener
* @return
*/
public Builder setPositiveButton(int positiveButtonText,
kListener listener) { veButtonText = (String) context
.getText(positiveButtonText);
veButtonClickListener = listener;
return this;
}
/**
* Set the positive button text and it's listener
* @param positiveButtonText
* @param listener
* @return
*/
public Builder setPositiveButton(String positiveButtonText,
kListener listener) {
veButtonText = positiveButtonText;
veButtonClickListener = listener;
return this;
}
/**
* Set the negative button resource and it's listener
* @param negativeButtonText
* @param listener
* @return
*/
public Builder setNegativeButton(int negativeButtonText,
kListener listener) {
veButtonText = (String) context
.getText(negativeButtonText);
veButtonClickListener = listener;
return this;
}
/**
* Set the negative button text and it's listener
* @param negativeButtonText
* @param listener
* @return
*/
public Builder setNegativeButton(String negativeButtonText,
kListener listener) {
veButtonText = negativeButtonText;
veButtonClickListener = listener;
return this; }
/**
* Create the custom dialog
*/
public CustomDialog create() {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(_INFLATER_SERVICE);
// instantiate the dialog with the custom Theme
final CustomDialog dialog = new CustomDialog(context,
);
View layout = e(, null);
tentView(layout, new LayoutParams(
_PARENT,
_CONTENT));
// set the dialog title
((TextView)
ewById()).setText(title);
// set the confirm button
if (positiveButtonText != null) {
((Button) ewById(veButton))
.setText(positiveButtonText);
if (positiveButtonClickListener != null) {
((Button)
ewById(veButton))
.setOnClickListener(new
kListener() {
public void onClick(View v) {
k(
dialog,
_POSITIVE);
}
});
}
} else {
// if no confirm button just set the visibility to GONE
ewById(veButton).setVisibility(
);
}
// set the cancel button if (negativeButtonText != null) {
((Button) ewById(veButton))
.setText(negativeButtonText);
if (negativeButtonClickListener != null) {
((Button)
ewById(veButton))
.setOnClickListener(new
kListener() {
public void onClick(View v) {
k(
dialog,
_NEGATIVE);
}
});
}
} else {
// if no confirm button just set the visibility to GONE
ewById(veButton).setVisibility(
);
}
// set the content message
if (message != null) {
((TextView) ewById(
e)).setText(message);
} else if (contentView != null) {
// if no message set
// add the contentView to the dialog body
((LinearLayout) ewById(t))
.removeAllViews();
((LinearLayout) ewById(t))
.addView(contentView,
new LayoutParams(
_CONTENT,
_CONTENT));
}
tentView(layout);
return dialog;
}
}
}
使用自定义的 Builder
使用方法很简单:
/**
* Build the desired Dialog
* CUSTOM or DEFAULT
*/
@Override
public Dialog onCreateDialog(int dialogId) {
Dialog dialog = null;
switch (dialogId) {
case CUSTOM_DIALOG :
r customBuilder = new
r();
le("Custom title")
.setMessage("Custom body")
.setNegativeButton("Cancel",
new kListener() {
public void onClick(DialogInterface dialog, int
which) {
.dismissDialog(CUSTOM_DIALOG);
}
})
.setPositiveButton("Confirm",
new kListener() {
public void onClick(DialogInterface dialog, int
which) {
s();
}
});
dialog = ();
break;
case DEFAULT_DIALOG :
r alertBuilder = new
r();
le("Default title")
.setMessage("Default body")
.setNegativeButton("Cancel",
new kListener() {
public void onClick(DialogInterface dialog, int
which) {
s(); }
})
.setPositiveButton("Confirm",
new kListener() {
public void onClick(DialogInterface dialog, int
which) {
.dismissDialog(DEFAULT_DIALOG);
}
});
dialog = ();
break;
}
return dialog;
}
完整的代码下载: SampleCustomDialog
Enjoy !
/10/custom-android-dialog/
发布者:admin,转转请注明出处:http://www.yc00.com/web/1689425523a246193.html
评论列表(0条)