Android高仿IOS和QQ的弹出对话框

来源:互联网 发布:打扮的女生知乎 编辑:程序博客网 时间:2024/05/17 09:06

        我们知道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 Themefinal 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 buttonif (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 GONElayout.findViewById(R.id.confirm_btn).setVisibility(View.GONE);}// set the cancel buttonif (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 GONElayout.findViewById(R.id.cancel_btn).setVisibility(View.GONE);}// set the content messageif (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;@Overrideprotected 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);}@Overridepublic 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() {@Overridepublic 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;}}};}


工程代码下载:http://download.csdn.net/detail/u013761665/8030735


0 0