Android自定义Dialog详解

本文介绍了一种在Android应用中自定义对话框的方法,包括创建继承Dialog的类、重写构造方法、绘制布局、实现业务逻辑及对话框展示等步骤,并提供完整代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(!!新手看过来!!—转载请著明出处跪谢!嘿嘿~—)在开发过程中经常会用到自定义对话框,今天自己总结下简单自定义一个对话框的方法和过程.
首先要自定义一个Dialog需要这几步:
1.创建一个继承Dialog的类
2.重写必要构造方法和其他方法
3.绘制对话框布局
4.对话框中的业务逻辑处理
5.实现对话样式的设置和定义
6.对话框在页面的展示
为了能充分理解所以步骤写的比较细.好了下面进行正文:
(每一步都对应上面写好的步骤)
1.创建一个自定义Dialog类继承Dialog;2.重写必要构造方法和其他方法:
import android.app.Dialog;
import android.content.Context;
public class MyDialog extends Dialog {

//继承自父类的构造器,共有三个构造器,此处只保留了两个来展示(一个是有主题形参的theme,一个是没有,如果你需要其他参数自己添加就好,在后面的步骤我会把回调参数和其他此例需要的参数添加到下面的构造器中)
    public MyDialog(Context context, int theme) {
        super(context, theme);
        this.context = context;
        this.myDialogListenser = myDialogListenser;
        this.mContentText = mContentText;
    }
    public MyDialog(Context context) {
        super(context);
    }
    //重写onCreat()方法
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
}
3.绘制对话框布局:
在res下layout文件夹下新建布局文件dialog_layout.xml,布局结构可根据自己项目要求自己定义(此处只简单添加了两个textview,一个用来显示用户在主页输入的内容,一个用来关闭对话框):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FFFFFF"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="194dp"
        android:background="#FFFFFF"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="20dp"
            android:text="这是文本展示框"
            android:textSize="30sp" />

        <TextView
            android:id="@+id/close"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="100dp"
            android:text="关闭"
            android:textSize="20sp" />
    </LinearLayout>

</LinearLayout>

写好布局后在MyDialog中把布局添加进去,并拿到布局中的组件:

// 重写onCreat()方法
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 布局填充器拿到写好的布局
        View layout = LayoutInflater.from(context).inflate(R.layout.dialog_layout, null);
        text = (TextView) layout.findViewById(R.id.text);
        close = (TextView) layout.findViewById(R.id.close);
        //把布局添加到页面上
        setContentView(layout);
    }

4.对话框中的业务逻辑处理:
首先业务逻辑有两点
(1)获取主页用户输入的内容显示在textview—->”text”上;
(2)对关闭按钮赋予关闭事件;
要实现关闭对话框事件有两种方法,第一在自定义对话框类中实现;第二在程序主页面实现.
如果对话框只是简单的功能那么就不用麻烦在主页面实现对对话框内容的操作了,如果需要在对话框中实现比较复杂的涉及数据和主页面数据处理和交互那么建议利用接口回调机制实现.
下面只按照第二种接口回调的方式实现对对话框的操作,这也是开发中经常遇到的一种情况:
(1)首先在MyDialog中定义接口定义一个关闭监听方法(我写这个方法的时候加了一个参数,意味着点击关闭按钮时对话框会把某些对话框中的数据传到主页面)

public interface MyDialogListenser {
        public void CloseClickListenser(String text);
    }

创建接口全局变量:

private MyDialogListenser myDialogListenser;

把回调添加到构造器中:

public MyDialog(Context context, int theme,String mContentText,MyDialogListenser myDialogListenser) {
        super(context, theme);
        this.context = context;
        this.myDialogListenser = myDialogListenser;
        this.mContentText = mContentText;
    }

(2)给关闭按钮添加点击事件

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 布局填充器拿到写好的布局
        View layout = LayoutInflater.from(context).inflate(R.layout.dialog_layout, null);
        text = (TextView) layout.findViewById(R.id.text);
        close = (TextView) layout.findViewById(R.id.close);
        close.setOnClickListener(this);//点击事件
    }
    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.close) {
            myDialogListenser.CloseClickListenser(mContentText+"这是dialog传回来的值:用户输入的值加上我自己写的内容");//此处把要回传的值添加进去.主页面就能拿到此值
        }
    }

(3)把主页面传过来的数据设置到对话框的页面上

// 重写onCreat()方法
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 布局填充器拿到写好的布局
        View layout = LayoutInflater.from(context).inflate(R.layout.dialog_layout, null);
        text = (TextView) layout.findViewById(R.id.text);
        if (!mContentText.equals("")) {
            text.setText(mContentText);
        }
        close = (TextView) layout.findViewById(R.id.close);
        close.setOnClickListener(this);
        //把布局添加到页面上
        setContentView(layout);
    }

主页面的逻辑一会儿在后面会写到,不要着急!
5.实现对话样式的设置和定义(可以在自定义类中实现也可以在主页面通过此类的对象实现)我通过在主页面实现 6.对话框在页面的展示(这两步一起写)
在主页面中
创建对话框对象并展示.其中在利用自定义类中的构造器创建对象的时候要传对话框主题样式

MyDialog myDialog= null;
    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.btn) {
            //拿到用户输入的内容
            String user_tv = user_input_et.getText().toString();
            myDialog= new MyDialog(this, R.style.mAlertDialog, user_tv, new MyDialogListenser() {
                @Override
                public void CloseClickListenser(String text) {

                    //此处写关闭操作text就是dialog穿过来的值
                }
            });
        }

    }

期中主题样式在res—->valus—>style.xml中定义

 <!-- 自定义弹出框的样式 -->
    <style name="mAlertDialog" >
        <item name="android:windowNoTitle">true</item>
    </style>

此处每一项作用可以网上查询
设置对话框位置什么的可以利用:

 Window dialogWindow = myDialog.getWindow();
            WindowManager.LayoutParams lp = dialogWindow.getAttributes();
            dialogWindow.setGravity(Gravity.CENTER);
            WindowManager m = getWindowManager();
            Display d = m.getDefaultDisplay(); // 获取屏幕宽、高用
            WindowManager.LayoutParams p = dialogWindow.getAttributes(); // 获取对话框当前的参数值
            p.height = (int) (d.getHeight() * 0.4); // 高度设置为屏幕的0.6
            p.width = (int) (d.getWidth() * 0.8); // 宽度设置为屏幕的0.65
            dialogWindow.setAttributes(p);

6.对话框展示: myDialog.show();
以上写的比较乱,代码也不全,下面是全部代码,可以结合步骤对照下面的代码了解:
//————————————————————————
(一)自定义dialog类:

package com.example.dialogtest;

import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;

public class MyDialog extends Dialog implements android.view.View.OnClickListener {

    private LayoutInflater inflater;
    private TextView text;
    private TextView close;
    private Context context;
    private MyDialogListenser myDialogListenser;
    private String mContentText;
    //本次事例使用的构造器
    public MyDialog(Context context, int theme, String mContentText, MyDialogListenser myDialogListenser) {
        super(context, theme);
        this.context = context;
        this.myDialogListenser = myDialogListenser;
        this.mContentText = mContentText;
    }
    //没有自定义样式的构造器,在这个例子中没有使用
    public MyDialog(Context context, String mContentText, MyDialogListenser myDialogListenser) {
        super(context);
        this.context = context;
        this.myDialogListenser = myDialogListenser;
        this.mContentText = mContentText;
    }

    // 重写onCreat()方法
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 布局填充器拿到写好的布局
        View layout = LayoutInflater.from(context).inflate(R.layout.dialog_layout, null);
        text = (TextView) layout.findViewById(R.id.text);
        //把主页面传过来的内容设置到dialog上
        if (!mContentText.equals("")) {
            text.setText(mContentText);
        }
        close = (TextView) layout.findViewById(R.id.close);
        //添加点击时间,类实现android.view.View.OnClickListener方法
        close.setOnClickListener(this);
        // 把布局添加到页面上
        setContentView(layout);
    }
    //接口
    public interface MyDialogListenser {
    //自定义的回调方法,添加了一个参数,用于把dialog中的内容返回去
        public void CloseClickListenser(String text);
    }
    //点击方法
    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.close) {
//利用实例化的接口对象调用定义好的接口方法,以便于实现回调
            myDialogListenser.CloseClickListenser(mContentText);
        }
    }
}
//--------------------------------------------------------

dialog布局文件dialog_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FFFFFF"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="194dp"
        android:background="#FFFFFF"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="20dp"
            android:text="这是文本展示框"
            android:textSize="30sp" />

        <TextView
            android:id="@+id/close"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="100dp"
            android:text="关闭"
            android:textSize="20sp" />
    </LinearLayout>

</LinearLayout>

主页代码MainActivity.java:

package com.example.dialogtest;

import android.support.v7.app.ActionBarActivity;

import com.example.dialogtest.MyDialog.MyDialogListenser;
import android.os.Bundle;
import android.view.Display;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity implements OnClickListener {
        //用户输入框
    private EditText user_input_et;
    //打开对话框的按钮
    private Button btn;
    //展示dialog返回数据的文本框
    private TextView back_text;
    //dialog对象
    private MyDialog myDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        user_input_et = (EditText) findViewById(R.id.user_input_et);
        back_text = (TextView) findViewById(R.id.edit);
        btn = (Button) findViewById(R.id.btn);
        btn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.btn) {
            // 拿到用户输入的内容
            String user_tv = user_input_et.getText().toString();
            myDialog = new MyDialog(this, R.style.mAlertDialog,user_tv, new MyDialogListenser() {

                @Override
                public void CloseClickListenser(String text) {
                    // 把对话框传回来的值设置到主页上;
                    back_text.setText(text);
                    // 点击按钮关闭对话框
                    myDialog.dismiss();
                }
            });
            //设置对话框位置的操作
            Window dialogWindow = myDialog.getWindow();
            WindowManager.LayoutParams lp = dialogWindow.getAttributes();
            dialogWindow.setGravity(Gravity.CENTER);
            WindowManager m = getWindowManager();
            Display d = m.getDefaultDisplay(); // 获取屏幕宽、高用
            WindowManager.LayoutParams p = dialogWindow.getAttributes(); // 获取对话框当前的参数值
            p.height = (int) (d.getHeight() * 0.4); // 高度设置为屏幕的0.6
            p.width = (int) (d.getWidth() * 0.8); // 宽度设置为屏幕的0.65
            dialogWindow.setAttributes(p);
            //展示对话框
            myDialog.show();
        }

    }

}
//--------------------------------------------------------

主页布局文件activity_main.xml:


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <EditText
        android:id="@+id/user_input_et"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_marginTop="10dp"
        android:gravity="center"
        android:textColor="#FFFFFF"
        android:background="@color/dim_foreground_disabled_material_light"
        android:hint="请输入对话框要显示的内容" />

    <TextView
        android:id="@+id/edit"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_marginTop="10dp"
        android:gravity="center"
        android:text="此处显示对话框返回的值"
        android:background="@color/dim_foreground_disabled_material_light" />

    <Button
        android:id="@+id/btn"
        android:layout_width="100dp"
        android:layout_marginTop="10dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="展示我的自定义对话框" />

</LinearLayout>
//--------------------------------------------------------

源码地址:http://download.youkuaiyun.com/detail/github_33905879/9501880

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值