我们知道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; } } }; }