欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > > 内容正文

Android多种方式实现自定义Dialog对话框,androiddialog,这个时候我们想到的是自定

来源: 开发者 投稿于  被查看 20381 次 评论:165

Android多种方式实现自定义Dialog对话框,androiddialog,这个时候我们想到的是自定


现今的APP开发都很讲究用户体验,而系统提供的原生工具都长得比较丑,或者功能不满足我们的需求。这个时候我们想到的是自定义,而Dialog对话框也是经常需要自定义的一个工具。必须让它符合我们整体的风格!!下面就来介绍下三种自定义dialog的方法。




首先需要一个自定义的布局XML文件

自定义Dialog可以通过XML或者Java代码的方式去定义新Dialog的界面。在这里我们使用XML文件,这样会比较直观。


在下面我做了一个简单的布局来演示自定义功能。

115903aln3ug3azd90i3u7.png

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类然后使用自己的布局文件来实现自定义。实现起来也是很简单的。

115903aln3ug3azd90i3u7.png

下面来看看代码:

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属性实现

115903aln3ug3azd90i3u7.png

而这里是通过在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实现

115903aln3ug3azd90i3u7.png

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);

三种方式的优缺点

1Dialog的位置相对固定,而PopupWindow的位置可以随意

2Dialog是非阻塞线程的,而PopupWindow是阻塞线程的

3activity的方式是位置可以相对随意,并非阻塞线程


用户评论