自定义dialog、验证邮箱的dialog

本文介绍了一种用于邮箱验证的自定义对话框设计方法,包括布局文件和核心代码。该对话框可在用户注册后提示其检查邮箱并完成验证流程。

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

当我们使用邮箱注册之后,应用应该提示用户去邮箱打开验证邮箱,这里我用了一个自定义的对话框实现这个功能,由于代码里面涉及到Bmob的部分功能,所以没有了解过Bmob的同学可以先去了解一下Bmob。

效果图:


布局文件:

<?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="#fff"
    android:orientation="vertical">

    <TextView
        android:id="@+id/validate_dialog_email_text"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="6"
        android:padding="20dp"
        android:text="validate your email" />

    <Button
        android:id="@+id/validate_dialog_email_positive_btn"
        android:background="@drawable/bg_login_btn"
        android:layout_width="match_parent"
        android:layout_margin="5dp"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:text="positive" />

    <Button
        android:layout_marginLeft="5dp"
        android:layout_marginBottom="5dp"
        android:layout_marginRight="5dp"
        android:id="@+id/validate_dialog_email_negative_btn"
        android:background="@drawable/bg_login_btn"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:text="negative" />


</LinearLayout>
核心代码:

package com.martsforever.owa.timekeeper.register;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.util.TypedValue;
import android.view.Display;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.martsforever.owa.timekeeper.R;
import com.martsforever.owa.timekeeper.javabean.Person;
import com.martsforever.owa.timekeeper.main.MainActivity;
import com.martsforever.owa.timekeeper.util.ActivityManager;
import com.martsforever.owa.timekeeper.util.ShowMessageUtil;

import java.util.List;

import cn.bmob.v3.BmobQuery;
import cn.bmob.v3.exception.BmobException;
import cn.bmob.v3.listener.FindListener;
import cn.bmob.v3.listener.UpdateListener;

/**
 * Created by owa on 2017/1/13.
 */

public class ValidateEmailDialog extends Dialog {

    /*这是个验证邮箱的dialog,所以在初始化的时候需要传入邮箱地址*/
    String email;

    Activity activity;
    Context context;
    AlertDialog dialog;
    TextView msg;
    Button positiveButton;
    Button negativeBUtton;

    /*信息显示大小*/
    int textSize = 20;
    /*横向占屏比*/
    double widthProportion = 0.8;
    /*纵向占屏比*/
    double heightProportion = 0.6;

    public ValidateEmailDialog(Context context, final Activity activity, final String email) {
        super(context);
        this.context = context;
        this.activity = activity;
        this.email = email;
        dialog = new android.app.AlertDialog.Builder(context).create();
        dialog.show();

        Window window = dialog.getWindow();
        window.setContentView(R.layout.dialog_register_validate_email);
        msg = (TextView) window.findViewById(R.id.validate_dialog_email_text);
        msg.setTextSize(TypedValue.COMPLEX_UNIT_SP, textSize);
        msg.setText("We have sent the validation information to your  registered email,please check.the verify email sent to you will become invalidate within a week");

        /*设置对话框的宽高*/
        Window dialogWindow = dialog.getWindow();
        WindowManager manager = activity.getWindowManager();
        /*获取屏幕的宽高信息*/
        Display display = manager.getDefaultDisplay();
        WindowManager.LayoutParams parameter = dialogWindow.getAttributes();
        parameter.height = (int) (display.getHeight() * heightProportion);
        parameter.width = (int) (display.getWidth() * widthProportion);
        dialogWindow.setAttributes(parameter);

        positiveButton = (Button) window.findViewById(R.id.validate_dialog_email_positive_btn);
        positiveButton.setText("I have checked the email");
        positiveButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                BmobQuery<Person> query = new BmobQuery<Person>();
                query.addWhereEqualTo("email", email);
                query.findObjects(new FindListener<Person>() {
                    @Override
                    public void done(List<Person> list, BmobException e) {
                        if (e == null) {
//                            if the email is not registered
                            if (!list.get(0).getEmailVerified()) {
                                msg.setText("Are you sure you have opened the verification link in your email?We haven't received any messages yet");
                            } else {
                                ShowMessageUtil.tosatFast("verify pass!", activity);
                                entryMainActivity();
                            }
                        } else {
                            ShowMessageUtil.tosatFast("fail to access data!" + e.getMessage(), activity);
                        }
                    }
                });

            }
        });

        negativeBUtton = (Button) window.findViewById(R.id.validate_dialog_email_negative_btn);
        negativeBUtton.setText("I don't receive the velidate email");
        negativeBUtton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Person.requestEmailVerify(email, new UpdateListener() {
                    @Override
                    public void done(BmobException e) {
                        if (e == null) {
                            msg.setText("request email validation success!please go to " + email + " mailbox to active!");
                        } else {
                            ShowMessageUtil.tosatFast("fail to access data!" + e.getMessage(), activity);
                        }
                    }
                });
            }
        });


    }

    private void entryMainActivity() {
//        entry MainActivity
        Intent intent = new Intent();
        intent.setClass(activity, MainActivity.class);
        activity.startActivity(intent);
        activity.finish();
        ActivityManager.destoryActivity("loginActivity");
    }

    public void dismiss() {
        dialog.dismiss();
    }
}



### NaiveUI Dialog 组件使用教程与常见问题 NaiveUI 是一个基于 Vue 3 的组件库,其 `Dialog` 组件提供了强大的弹窗功能,适用于多种交互场景。以下是关于 `Dialog` 组件的使用方法和常见问题的详细说明。 #### 基本使用方法 在 NaiveUI 中,`Dialog` 组件可以通过 `v-model:show` 控制弹窗的显示与隐藏,同时支持多种配置选项,如标题、内容、确认按钮和取消按钮等。以下是一个简单的示例: ```vue <template> <n-button @click="showDialog = true">打开弹窗</n-button> <n-dialog v-model:show="showDialog" title="提示" content="这是一个简单的弹窗示例" positive-text="确认" negative-text="取消" @positive-click="handlePositiveClick" @negative-click="handleNegativeClick" /> </template> <script> export default { data() { return { showDialog: false }; }, methods: { handlePositiveClick() { console.log('用户点击了确认按钮'); }, handleNegativeClick() { console.log('用户点击了取消按钮'); } } }; </script> ``` #### 自定义内容与样式 `n-dialog` 组件支持通过插槽自定义内容,允许开发者在弹窗中嵌入任意的 HTML 或 Vue 组件。以下示例展示了如何在弹窗中嵌入一个表单: ```vue <template> <n-button @click="showDialog = true">打开表单弹窗</n-button> <n-dialog v-model:show="showDialog" title="填写表单" :show-icon="false" @positive-click="submitForm" > <template #default> <n-form :model="form" :rules="rules" ref="formRef"> <n-form-item path="name" label="姓名"> <n-input v-model:value="form.name" placeholder="请输入姓名" /> </n-form-item> <n-form-item path="email" label="邮箱"> <n-input v-model:value="form.email" placeholder="请输入邮箱" /> </n-form-item> </n-form> </template> <template #action> <n-button type="primary" @click="submitForm">提交</n-button> </template> </n-dialog> </template> <script> export default { data() { return { showDialog: false, form: { name: '', email: '' }, rules: { name: { required: true, message: '请输入姓名', trigger: 'blur' }, email: { required: true, message: '请输入邮箱', trigger: 'blur' } } }; }, methods: { submitForm() { this.$refs.formRef.validate(valid => { if (valid) { console.log('表单验证通过', this.form); this.showDialog = false; } }); } } }; </script> ``` #### 在 UniApp 中的使用 在 UniApp 中使用 NaiveUI 的 `Dialog` 组件时,需要确保项目配置为 Vue 3 模式。安装 NaiveUI 后,可以在项目中引入其组件库,例如: ```javascript import { createApp } from "vue"; import App from "./App.vue"; import NaiveUI from "naive-ui"; import "naive-ui/dist/naive-ui.css"; const app = createApp(App); app.use(NaiveUI); app.mount("#app"); ``` #### 常见问题与解决方案 ##### 1. 弹窗无法正确显示 如果 `Dialog` 组件无法正确显示,首先检查是否正确绑定了 `v-model:show` 属性。确保 `showDialog` 的初始值为 `false`,并且在点击按钮时将其设置为 `true`。 ##### 2. 弹窗内容过长导致滚动问题 当弹窗内容较多时,可能会导致页面滚动不畅。可以通过设置 `n-dialog` 的 `scrollable` 属性为 `true` 来启用内部滚动: ```vue <n-dialog v-model:show="showDialog" scrollable> <!-- 弹窗内容 --> </n-dialog> ``` ##### 3. 弹窗层级问题 在某些情况下,`Dialog` 组件可能会被其他元素遮挡。可以通过设置 `z-index` 属性来调整弹窗的层级: ```vue <n-dialog v-model:show="showDialog" :z-index="9999"> <!-- 弹窗内容 --> </n-dialog> ``` ##### 4. 多个弹窗顺序问题 如果需要在关闭一个弹窗后立即打开另一个弹窗,可以使用 `@close` 事件来触发下一个弹窗的显示: ```vue <template> <n-button @click="showFirstDialog = true">打开第一个弹窗</n-button> <n-dialog v-model:show="showFirstDialog" title="第一个弹窗" content="这是第一个弹窗的内容" positive-text="确认" @close="showSecondDialog = true" /> <n-dialog v-model:show="showSecondDialog" title="第二个弹窗" content="这是第二个弹窗的内容" positive-text="确认" /> </template> <script> export default { data() { return { showFirstDialog: false, showSecondDialog: false }; } }; </script> ``` ##### 5. 弹窗关闭后数据未重置 如果弹窗关闭后需要重置表单或其他数据,可以在 `@close` 事件中执行重置逻辑: ```vue <template> <n-button @click="showDialog = true">打开弹窗</n-button> <n-dialog v-model:show="showDialog" title="提示" content="这是一个简单的弹窗示例" positive-text="确认" @close="resetForm" /> </template> <script> export default { data() { return { showDialog: false, form: { name: '', email: '' } }; }, methods: { resetForm() { this.form.name = ''; this.form.email = ''; } } }; </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值