我们知道Android中其实并不提供圆形的东西,像Button,TextView,EditView等等都是没有弧形元素在里面(看看这些控件的属性就知道了)。而很多时候我们的程序中又需要用到这样有弧形元素的控件,当然我们着先肯定会想到用图片去遮盖,例如我们要一个圆形的图片,我们可以在原有图片的基础上加上一个中间为空的图片。这样就可以获得圆形图片的效果。不过,这样方法一看就可以水平比较低的。因为要用这样的一张图片,势必消耗资源。不过,如果我们是要去实现一个非常不规则的图形时,这里,我们可以去采用图片覆盖的方法。言归正传,其实要获得圆形图片的方法我们可以去画,在以后我更新博客来讲解这个问题。
我们来看一下这个仿IOS或是QQ的自定义的Dialog究竟长什么样子。如下:
再来看看Android原生的Dialog长什么样子,如下:
这里我只截取了屏幕的一部分来展示,自定义的Dialog显而易见。
我们可以这样来思考,要实现这样一个效果,那它应该是一个Dialog。因为我们是要让它弹出来(说实话,如果你非要把整个搞一个Activity或是Fragment,然后设置背景透明,这样可以!不过不建议)。
于是我们知道,我们的CustomDialog要去继承Android原生的Dialog,而同时又必须去重写里面的方法。像setPositiveButton(...),setNegativeButton(...),create()等。不过,show()方法不用重写,这里我感觉应该是和Toast中的show()的原理一样,只是将我们的Dialog加入到系统的Dialog队列中(当然也可能不是)。重写其方法的关键代码如下:
public Builder setContentView(View v) {
this.contentView = v;
return this;
}
public Builder setPositiveButton(int confirm_btnText,
DialogInterface.OnClickListener listener) {
this.confirm_btnText = (String) context
.getText(confirm_btnText);
this.confirm_btnClickListener = listener;
return this;
}
public Builder setPositiveButton(String confirm_btnText,
DialogInterface.OnClickListener listener) {
this.confirm_btnText = confirm_btnText;
this.confirm_btnClickListener = listener;
return this;
}
public Builder setNegativeButton(int cancel_btnText,
DialogInterface.OnClickListener listener) {
this.cancel_btnText = (String) context
.getText(cancel_btnText);
this.cancel_btnClickListener = listener;
return this;
}
public Builder setNegativeButton(String cancel_btnText,
DialogInterface.OnClickListener listener) {
this.cancel_btnText = cancel_btnText;
this.cancel_btnClickListener = listener;
return this;
}
public CustomDialog create() {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// instantiate the dialog with the custom Theme
final CustomDialog dialog = new CustomDialog(context, R.style.mystyle);
View layout = inflater.inflate(R.layout.customdialog, null);
dialog.addContentView(layout, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
// set the dialog title
((TextView) layout.findViewById(R.id.title)).setText(title);
((TextView) layout.findViewById(R.id.title)).getPaint().setFakeBoldText(true);;
// set the confirm button
if (confirm_btnText != null) {
((Button) layout.findViewById(R.id.confirm_btn))
.setText(confirm_btnText);
if (confirm_btnClickListener != null) {
((Button) layout.findViewById(R.id.confirm_btn))
.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
confirm_btnClickListener.onClick(dialog,
DialogInterface.BUTTON_POSITIVE);
}
});
}
} else {
// if no confirm button just set the visibility to GONE
layout.findViewById(R.id.confirm_btn).setVisibility(
View.GONE);
}
// set the cancel button
if (cancel_btnText != null) {
((Button) layout.findViewById(R.id.cancel_btn))
.setText(cancel_btnText);
if (cancel_btnClickListener != null) {
((Button) layout.findViewById(R.id.cancel_btn))
.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
cancel_btnClickListener.onClick(dialog,
DialogInterface.BUTTON_NEGATIVE);
}
});
}
} else {
// if no confirm button just set the visibility to GONE
layout.findViewById(R.id.cancel_btn).setVisibility(
View.GONE);
}
// set the content message
if (message != null) {
((TextView) layout.findViewById(R.id.message)).setText(message);
} else if (contentView != null) {
((LinearLayout) layout.findViewById(R.id.message))
.removeAllViews();
((LinearLayout) layout.findViewById(R.id.message)).addView(
contentView, new LayoutParams(
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT));
}
dialog.setContentView(layout);
return dialog;
}
使用的方法其实和我们使用AlertDialog的方法差不多,如下:
CustomDialog.Builder builder = new Builder(MainActivity.this);
builder.setTitle(R.string.prompt);
builder.setMessage(R.string.exit_app);
builder.setPositiveButton(R.string.confirm, dialogButtonClickListener);
builder.setNegativeButton(R.string.cancel, dialogButtonClickListener);
builder.create().show();
同原生Dialog一样,这里的自定义Dialog不仅可以显示提示信息,其实它可以显示任何你想要显示的信息。关键是这里的builder.setMessage(R.string.exit_app);,这里的setMessage(...)的参数只是字符串,我们可以给它传一个对象,任何你想要传给它的对象。例如下图所示:
图中用红色标出的地方,是一个Layout,我们可以创建一个Model,类似Java中bean,这个Model里有各种我们需要显示的信息,以作为这个Model的成员。
如下是程序MainActivity的全部代码,在此贴出代码的原因是这里的MainActivity和我的工程中的MainActivity的代码有不一样的地方,主要是有关于确定和取消按钮的点击监听事件。
public class MainActivity extends Activity implements OnClickListener{
private Button ios_dialog_btn,android_dialog_btn;
private Toast mToast;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ios_dialog_btn = (Button) findViewById(R.id.ios_dialog_btn);
android_dialog_btn = (Button) findViewById(R.id.android_dialog_btn);
ios_dialog_btn.setOnClickListener(this);
android_dialog_btn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.ios_dialog_btn:
CustomDialog.Builder builder = new Builder(MainActivity.this);
builder.setTitle(R.string.prompt);
builder.setMessage(R.string.exit_app);
builder.setPositiveButton(R.string.confirm, dialogButtonClickListener);
builder.setNegativeButton(R.string.cancel, dialogButtonClickListener);
builder.create().show();
break;
case R.id.android_dialog_btn:
AlertDialog.Builder mbuilder = new AlertDialog.Builder(MainActivity.this);
mbuilder.setTitle(R.string.prompt);
mbuilder.setMessage(R.string.exit_app);
mbuilder.setPositiveButton(R.string.confirm, dialogButtonClickListener);
mbuilder.setNegativeButton(R.string.cancel, dialogButtonClickListener);
mbuilder.create().show();
break;
default:
break;
}
}
private void showToast(CharSequence message) {
if (null == mToast) {
mToast = Toast.makeText(this, message, Toast.LENGTH_SHORT);
mToast.setGravity(Gravity.CENTER, 0, 0);
} else {
mToast.setText(message);
}
mToast.show();
}
private DialogInterface.OnClickListener dialogButtonClickListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case DialogInterface.BUTTON_POSITIVE:
dialog.dismiss();
showToast("你点击了确定按钮.");
break;
case DialogInterface.BUTTON_NEGATIVE:
dialog.dismiss();
showToast("你点击了取消按钮.");
break;
default:
break;
}
}
};
}