成功给网站增加关注、粉丝功能;移植了Tint主题的新特征,折腾告一段落!
   2015-07-17 0:18 来源:LJY2345 |   抢沙发 |  隐藏边栏  39 
  评分 0 次,平均分 0.0

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

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

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

 

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

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

下面来看看代码:

[Java]

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方法中调用以下方法来去掉标题栏

[Java]

requestWindowFeature(Window.FEATURE_NO_TITLE);



使用:

完成了以上步骤之后,在需要调用的地方写上如下代码就可以启动我们的自定义Dialog啦。

 

[Java]

MyDialog myDialog = new MyDialog(this, "我是继承Dialog类实现的自定义Dialog");

myDialog.show();

二、设置Activity属性实现

而这里是通过在AndroidManifest设置Activity的属性

[XML] 纯文本查看 复制代码

?

android:theme="@android:style/Theme.Dialog"

 

然后在activity就是平时的做法了。

 

[Java]

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的属性

[XML]

android:theme="@android:style/Theme.Dialog"



使用:

既然只是可以界面稍有不同的activity,那么在调用上也是跟activity的调用一样

 

[Java] 纯文本查看 复制代码

?

startActivity(new Intent(this, DialogActivity.class));

三、用PopupWindow实现

PopupWindow实现的可能跟上面的风格是不一样的,PopupWindow通过简单的设置就可以使用自定义布局。

[Java]

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对象

[Java] 纯文本查看 复制代码

?

View dialogView = LayoutInflater.from(this).inflate(R.layout.my_dialog, null);

 

2、初始化的时候设置我们的布局的View对象进去,同时设置PopupWindow的宽高。

[Java] 纯文本查看 复制代码

?

1

myPopupWindow = new PopupWindow(dialogView, 600, LayoutParams.WRAP_CONTENT);

 

3、显示PopupWindow,下面的方法是显示PopupWindow在某个view的下面。

[Java] 纯文本查看 复制代码

?

1

myPopupWindow.showAsDropDown(v);

使用:

在需要调用的位置调用上面的方法即可。

[Java]

showPopupWindow(v);

三种方式的优缺点

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

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

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

历史上的今天:

 

除特别注明外,本站所有文章均为LJY IT BLOG原创,转载请注明出处来自https://www.ljy2345.com/1657.html

博 主关于作者:
LJY IT BLOG的站长。

扫一扫打赏

支付宝扫一扫打赏

微信扫一扫打赏

发表评论

表情 格式
图片

                      

暂无评论

切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

切换登录

注册

扫一扫二维码分享