Android多种方式实现自定义Dialog对话框,androiddialog,这个时候我们想到的是自定
Android多种方式实现自定义Dialog对话框,androiddialog,这个时候我们想到的是自定
现今的APP开发都很讲究用户体验,而系统提供的原生工具都长得比较丑,或者功能不满足我们的需求。这个时候我们想到的是自定义,而Dialog对话框也是经常需要自定义的一个工具。必须让它符合我们整体的风格!!下面就来介绍下三种自定义dialog的方法。
首先需要一个自定义的布局XML文件
自定义Dialog可以通过XML或者Java代码的方式去定义新Dialog的界面。在这里我们使用XML文件,这样会比较直观。
在下面我做了一个简单的布局来演示自定义功能。
xml文件的代码:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="300dp" android:layout_height="match_parent" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:text="www.apkbus.com" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textView1" android:layout_centerHorizontal="true" android:layout_marginTop="14dp" android:text="自定义Dialog demo" /> <TextView android:id="@+id/dialog_name_textview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textView2" android:layout_centerHorizontal="true" android:text="TextView" /> <Button android:id="@+id/cancel_button" android:layout_width="100dp" android:layout_height="wrap_content" android:layout_below="@+id/dialog_name_textview" android:layout_centerHorizontal="true" android:layout_marginTop="16dp" android:text="关闭" /> </RelativeLayout>
一、继承Dialog类实现
这个也许是比较常用的一个方法了,通过继承Dialog类然后使用自己的布局文件来实现自定义。实现起来也是很简单的。
下面来看看代码:
package com.apkbus.apkbusdialog; import android.app.Dialog; import android.content.Context; import android.os.Bundle; import android.view.View; import android.widget.TextView; public class MyDialog extends Dialog { private String dialogName; public MyDialog(Context context,String dialogName) { super(context); this.dialogName = dialogName; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.my_dialog); ((TextView) findViewById(R.id.dialog_name_textview)).setText(dialogName); findViewById(R.id.cancel_button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dismiss(); } }); } }
说明:
1、需要实现一个非默认的构造函数,如果没有系统会提示有错。
2、需要实现一个onCreate(Bundle savedInstanceState)方法,在这里可以通过setContentView(R.layout.my_dialog);方法设置您的自定义布局,然后就是对布局控件的绑定,初始化等操作了。
3、关于Dialog自带的标题栏,如果不需要可以通过在onCreate方法中调用以下方法来去掉标题栏
requestWindowFeature(Window.FEATURE_NO_TITLE);
使用:
完成了以上步骤之后,在需要调用的地方写上如下代码就可以启动我们的自定义Dialog啦。
MyDialog myDialog = new MyDialog(this, "我是继承Dialog类实现的自定义Dialog"); myDialog.show();
二、设置Activity属性实现
而这里是通过在AndroidManifest设置Activity的属性
android:theme="@android:style/Theme.Dialog"
然后在activity就是平时的做法了。
package com.apkbus.apkbusdialog; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.widget.TextView; public class DialogActivity extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.my_dialog); ((TextView) findViewById(R.id.dialog_name_textview)).setText("我是Activity实现的自定义dialog"); findViewById(R.id.cancel_button).setOnClickListener(new OnClickListener() { public void onClick(View v) { DialogActivity.this.finish(); } }); } }
说明:
就像上面的代码一样,activity中并不需要做什么特别的操作。只是一个界面变成了Dialog的普通activity,操作跟以前一样。
只需要在AndroidManifest设置Activity的属性
android:theme="@android:style/Theme.Dialog"
使用:
既然只是可以界面稍有不同的activity,那么在调用上也是跟activity的调用一样
startActivity(new Intent(this, DialogActivity.class));
三、用PopupWindow实现
PopupWindow实现的可能跟上面的风格是不一样的,PopupWindow通过简单的设置就可以使用自定义布局。
private void showPopupWindow(View v){ View dialogView = LayoutInflater.from(this).inflate(R.layout.my_dialog, null); ((TextView) dialogView.findViewById(R.id.dialog_name_textview)).setText("我是PopupWindow实现的自定义Dialog"); dialogView.findViewById(R.id.cancel_button).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { myPopupWindow.dismiss(); } }); myPopupWindow = new PopupWindow(dialogView, 600, LayoutParams.WRAP_CONTENT); // 使其聚集 myPopupWindow.setFocusable(true); // 设置允许在外点击消失 myPopupWindow.setOutsideTouchable(true); //设置背景,不设置背景点击返回按钮无法关闭PopupWindow myPopupWindow.setBackgroundDrawable(new ColorDrawable(Color.CYAN)); myPopupWindow.showAsDropDown(v); }
说明:
PopupWindow的使用主要有下面几个步骤
1、使用LayoutInflater获得自定义布局的View对象
View dialogView = LayoutInflater.from(this).inflate(R.layout.my_dialog, null);
2、初始化的时候设置我们的布局的View对象进去,同时设置PopupWindow的宽高。
myPopupWindow = new PopupWindow(dialogView, 600, LayoutParams.WRAP_CONTENT);
3、显示PopupWindow,下面的方法是显示PopupWindow在某个view的下面。
myPopupWindow.showAsDropDown(v);
使用:
在需要调用的位置调用上面的方法即可。
showPopupWindow(v);
三种方式的优缺点
1、Dialog的位置相对固定,而PopupWindow的位置可以随意
2、Dialog是非阻塞线程的,而PopupWindow是阻塞线程的
3、activity的方式是位置可以相对随意,并非阻塞线程
用户评论