【android学习】Dialog对话框

1,Dialog

1)onCreateDialog(int)

2)showDialog(int)

第一次请求时,会从Activity中调用onCreateDialog。

3)onPrepareDialog(int,Dialog)

在每次打开对话框时被调用。

4)dismissDialog(int)

关闭对话框时,可以调用dismiss()。
在Activity中调用dismissDialog,会为这个对话框调用dismiss方法。

如果想使用onCreateDialog方法来管理对话框的状态,然后还在每次对话框消除的时候,这个对话框对象的状态将由该Activity保留。

5)removeDialog(intid)

调用该方法,将删除任何内部对象引用。如果这个对话框正在显示,也会删除。

6)常见对话框

private Dialog dialog;
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    //创建一个默认对话框
    dialog = new Dialog(this);
    //添加xml对象到Dialog对象中
    dialog.setContentView(R.layout.dialog1);
    //设置标题
    dialog.setTitle("Dialog");
    //显示对话框
    dialog.show();
}

7)是否允许取消

①对于Dialog dialog

dialog.setCancelable(false);
//dialog弹出后会点击屏幕或物理返回键,dialog不消失

②extends Dialog的类

setCanceledOnTouchOutside(isCancelable);//false为不消失

9)style

    <style name="MyDialog" parent="android:style/Theme.Dialog">  
        <!--背景颜色及和透明程度-->  
        <item name="android:windowBackground">@android:color/transparent</item>  
        <!--是否去除标题 -->  
        <item name="android:windowNoTitle">true</item>  
        <!--是否 全屏-->
        <item name="android:windowFullscreen">true</item>
        <!--是否去除边框-->  
        <item name="android:windowFrame">@null</item>  
        <!--是否浮现在activity之上-->  
        <item name="android:windowIsFloating">true</item>  
        <!--是否模糊-->  
        <item name="android:backgroundDimEnabled">false</item>  
    </style>  

10)对话框置顶

        WindowManager.LayoutParams layoutParams= new WindowManager.LayoutParams();
        layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
        layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT;
        layoutParams.gravity = Gravity.TOP|Gravity.RIGHT;
        getWindow().setAttributes(layoutParams);

2,AlterDialog

1)Builder

AlterDialog通过AlterDialog的Builder进行创建,不能直接用new关键字构建对象。

因为其构造器都是保护的,所以不允许非子类调用。

AlertDialog.Builder builder = new AlertDialog.Builder(this);

2)setPositiveButton

setPositiveButton方法用来加确定按钮。

builder.setPositiveButton("确定"new DialogInterface.OnClickListener(){
    @Override
    public void onClick(DialogInterface dialog, int which){

    }
});

3)setNegativeButton

setNegativeButton方法用来加取消按钮。

4)show

用于创建并显示对话框。builder.show();
show()源码:

public AlertDialog show() {
            AlertDialog dialog = create();
            dialog.show();
     return dialog;
        }

create()方法可以创建对话框,但不显示。

5)setTitle

给AlterDialog设置标题。

builder.setTitle("标题");

6)setMessage

给AlterDialog设置内容。

builder.setMessage("内容");

7)setCancelable()

在这儿设置的时false,表示弹出的AlterDialog在用户点击返回键时不消失,该值默认是true。

8)setIcon

预设图片。

builder.setIcon(android.R.drawable.ic);

9)setView

添加自定义控件

LayoutInflater lif = LayoutInflater.from(this);
View editView = lif.inflate(R.layout.dialog3, null);
builder.setView(editView);

10)setSingleChoiceItems

单选对话框。

builder.setSingleChoiceItems(new String[]{"Item1","Item2","Item3"},0,new DialogInterface.OnClickListener(){
    public void onClick(DialogInterface dialog, int which){
        dialog.dismiss();
    }
});

11)setMultiChoiceItems

多选对话框。

builder.setMultiChoiceItems(new String[] {"Item1","Item2"},null,null);

12)setItems

列表对话框。

builder.setItems(new String[] {"Item1","Item2"},null);

3,ProgressDialog

1)概念

进度对话框,会有一个循环的进度条显示在对话框上。

2)demo

ProgressDialog dialog = new ProgressDialog(this);
dialog.setTitle("标题");
dialog.setMessage("请稍后");
dialog.show();

4,实现Dialog类型无标题栏和ActionBar的Activity

方案一:
myAcitivity可以继承AppCompatActivity,然后设置主题:android:theme="@style/AppTheme.Dialog"

<style name="AppTheme.Dialog" parent="Theme.AppCompat.Light.Dialog">    
    <item name="windowNoTitle">true</item>    
</style>   

方案二:

android:theme="@style/dialog"

myAcitivity继承Acitivity(如果继承AppCompatActivity会出错)

5,继承Dialog

1)demo-AskDialog

i>AskDialog.java

/**
 * Created by luo on 2018/1/5.
 */
public class AskDialog extends BasalDialog implements View.OnClickListener {

    private OnCancelListener cancelListener;
    private  boolean cancelable;

    @BindView(R.id.tv_dialog_ask_query)
     TextView tv_query;//确定按钮
    @BindView(R.id.tv_dialog_ask_cancel)
     TextView tv_cancel;//取消按钮
    @BindView(R.id.tv_dialog_ask_question)
     TextView tv_question;//问题
    private String questionStr;
    private String cancelStr;

    public AskDialog setQuestionStr(String questionStr) {
        this.questionStr = questionStr;
        return this;
    }

    public AskDialog setCancelStr(String cancelStr) {
        this.cancelStr = cancelStr;
        return this;
    }

    public AskDialog setQueryStr(String queryStr) {
        this.queryStr = queryStr;
        return this;
    }

    private String queryStr;

    public AskDialog(@NonNull Context context) {
        super(context);
    }
    public AskDialog(@NonNull Context context, int theme) {
        super(context,theme);
    }

    public AskDialog(@NonNull Context context, boolean cancelable, @Nullable OnCancelListener cancelListener) {
        super(context, cancelable, cancelListener);
        this.cancelable = cancelable;
        this.cancelListener = cancelListener;


    }
    public AskDialog setOnDialogClickListener(OnDialogClickListener onDialogClickListener) {
           this.onDialogClickListener = onDialogClickListener;
           return this;
    }

    private OnDialogClickListener onDialogClickListener = null;

    @Override
    protected int getLayoutId() {
        return R.layout.dialog_ask;
    }
    @Override
    protected void loadData() {

    }

    @Override
    protected void viewOption() {

        tv_question.setText(questionStr);
        tv_query.setText(queryStr);
        tv_cancel.setText(cancelStr);
    }
    @OnClick({R.id.tv_dialog_ask_cancel, R.id.tv_dialog_ask_query})
    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.tv_dialog_ask_cancel:
                if (null != onDialogClickListener){
                    onDialogClickListener.onCancelClick();
                }
                break;
            case R.id.tv_dialog_ask_query:
                if (null != onDialogClickListener){
                    onDialogClickListener.onQueryClick();
                }
                break;
        }
    }
}

ii>dialog_ask.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#20000000"
    android:gravity="center">

    <RelativeLayout
        android:layout_width="315dp"
        android:layout_height="105dp"
        android:background="@drawable/btn_white"
        android:paddingLeft="25dp"
        android:paddingTop="20dp"
        android:paddingBottom="20dp">
        <TextView
            android:id="@+id/tv_dialog_ask_question"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="16sp"
            android:textColor="@color/black"
            android:text="要清空全部足迹吗?"
            android:layout_alignParentTop="true"
            android:layout_alignParentLeft="true"/>

        <TextView
            android:id="@+id/tv_dialog_ask_cancel"
            android:layout_width="75dp"
            android:layout_height="24dp"
            android:gravity="center"
            android:textSize="13sp"
            android:textColor="@color/red"
            android:text="取消"
            android:layout_alignParentBottom="true"
            android:layout_toLeftOf="@+id/tv_dialog_ask_query"/>
        <TextView
            android:id="@+id/tv_dialog_ask_query"
            android:layout_width="75dp"
            android:layout_height="24dp"
            android:gravity="center"
            android:textSize="13sp"
            android:textColor="@color/red"
            android:text="确定"
            android:layout_alignParentRight="true"
            android:layout_alignParentBottom="true"/>
    </RelativeLayout>
</LinearLayout>

iii>BasalDialog.java

package com.dm.smyx.basal;

import android.app.Dialog;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.LinearLayout;

import butterknife.BindView;
import butterknife.ButterKnife;

/**
 * Created by luo on 2018/1/5.
 */

public abstract class BasalDialog extends Dialog {
    private Context mContext;
    public BasalDialog(@NonNull Context context) {
        super(context);
        mContext = context;
    }

    public BasalDialog(@NonNull Context context, int themeResId) {
        super(context, themeResId);
    }

    protected BasalDialog(@NonNull Context context, boolean cancelable, @Nullable OnCancelListener cancelListener) {
        super(context, cancelable, cancelListener);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(getLayoutId());
        getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        //设置window背景,默认的背景会有Padding值,不能全屏。当然不一定要是透明,你可以设置其他背景,替换默认的背景即可。
        getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        ButterKnife.bind(this);
        //按空白处不能取消动画
        setCanceledOnTouchOutside(false);
        //初始化界面数据
        loadData();
        //初始化界面控件的事件
        viewOption();
    }
    /**
     * 获取布局资源
     *
     * @return
     */
    protected abstract int getLayoutId();

    /**
     * 加载数据
     */
    protected abstract void loadData();

    /**
     * 为控件绑定事件
     */
    protected abstract void viewOption();
}

2)Dialog的全屏显示

①在setContentView()下写:

        //设置window背景,默认的背景会有Padding值,不能全屏。当然不一定要是透明,你可以设置其他背景,替换默认的背景即可。
        getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

注意:setLayout的高度参数设置为ViewGroup.LayoutParams.WRAP_CONTENT更好一点,否则会出现dialog把状态栏顶上去的情况。
②设置style:

    <style name="DialogFullscreenStyle" parent="@android:style/Theme.Dialog">
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowNoTitle">true</item>
    </style>

6,自定义Builder弹出对话框

1)含有标题、一个View、一个按钮的对话框

/** 
     * 含有标题、一个View、一个按钮的对话框 
     * @param title 
     * @param view 
     * @param positiveText 
     * @param onPositiveClickListener 
     * @param cancelable 
     * @return 
     */  
    public AlertDialog showET_Dialog(String title, View view,  
            String positiveText,  
            DialogInterface.OnClickListener onPositiveClickListener,Boolean cancelable) {  

        AlertDialog alertDialog = new AlertDialog.Builder(this).setTitle(title)  
                .setView(view)  
                .setPositiveButton(positiveText, onPositiveClickListener)  
                .setCancelable(cancelable)//设置为false,按返回键不能退出。默认为true  
                .show();  
        return alertDialog;  
    }  

调用的时候这样用:

LayoutInflater inflater =  LayoutInflater.from(mContext);  
        View view = inflater.inflate(R.layout.fragment_task_builder_et, null);  
        final ClearEditText et = (ClearEditText)view.findViewById(R.id.fra_task_builder_et_NumLoad);  

        ((MainActivity) getActivity()).showET_Dialog("提示", view, "完成",  
                new DialogInterface.OnClickListener() {  

            @Override  
            public void onClick(DialogInterface dialog, int which) {  

            }  

        }, true);  

.xml是这样的:

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="fill_parent"  
    android:layout_height="wrap_content"  
    android:gravity="center"  
    android:orientation="vertical"  
    android:padding="10dip" >  

    <TextView  
        style="@style/tv_standard"  
        android:textColor="@color/white"  
        android:gravity="left"  
        android:text="@string/fra_task_tv_NumLoad"  
        android:layout_marginBottom="10dip" />  

    <com.xaut.wx.view.ClearEditText  
        android:id="@+id/fra_task_builder_et_NumLoad"  
        style="@style/et_standard"  
        android:hint="@string/fra_task_et_NumLoad"  
        android:inputType="number" />  

</LinearLayout>  

运行图:
运行图片

7,PopupWindow

1)概念

自定义弹出。笔者认为使用PopupWindow会使类变的更长,可读性、代码美观降低,不推荐使用。建议封装成dialog使用。

2)与AlertDialog区别

AlertDialog不能指定显示位置,只能默认显示在屏幕最中间(可以通过设置WindowManager参数来改变位置)。
PopupWindow是可以指定显示位置的,更加灵活。

3)方法

①构造函数

//方法一:  
public PopupWindow (Context context)  
//方法二:  
public PopupWindow(View contentView)  
//方法三:  
public PopupWindow(View contentView, int width, int height)  
//方法四:  
public PopupWindow(View contentView, int width, int height, boolean focusable)  

②显示函数

//相对某个控件的位置(正左下方),无偏移  
showAsDropDown(View anchor):  
//相对某个控件的位置,有偏移;xoff表示x轴的偏移,正值表示向左,负值表示向右;yoff表示相对y轴的偏移,正值是向下,负值是向上;  
showAsDropDown(View anchor, int xoff, int yoff):  
//相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移  
showAtLocation(View parent, int gravity, int x, int y):  

③其它

public void dismiss()  
//另外几个函数,这里不讲其意义,下篇细讲  
public void setFocusable(boolean focusable)  
public void setTouchable(boolean touchable)  
public void setOutsideTouchable(boolean touchable)  
public void setBackgroundDrawable(Drawable background) 

4)实现

①popWindow的xml文件:popwindow.xml
②java

PopupWindow mPopWindow;
mPopWindow.dismiss();
//设置contentView
        View contentView = LayoutInflater.from(getContext()).inflate(R.layout.popwindow, null);
        mPopWindow = new PopupWindow(contentView,
                ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, true);
        mPopWindow.setContentView(contentView);
        mPopWindow.setOutsideTouchable(true);//点击屏幕关闭popWindow。注意,此属性如果失效,请检查inflate时窗口的大小是否全屏(全屏则无外部点击一说)
        mPopWindow.setBackgroundDrawable(new BitmapDrawable());
        //设置各个控件的点击响应
        LinearLayout ll_popwindow = (LinearLayout) contentView.findViewById(R.id.ll_popwindow);
       ll_popwindow.setOnClickListener(this);

        //显示PopupWindow
        View rootview = LayoutInflater.from(getContext()).inflate(R.layout.fragment_car, null);
        mPopWindow.showAsDropDown(tv);//显示位置
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
超炫Dialog对话框是一种专为手机应用程序设计的界面元素,其设计风格炫目而富有创意。它具有以下几个特点: 首先,超炫Dialog对话框具有丰富多彩的样式和动画效果。通过使用各种鲜艳的颜色和精心设计的动态效果,该对话框能够吸引用户的眼球,增加界面的活力和吸引力。 其次,超炫Dialog对话框提供了多种交互方式。它可以响应不同的用户操作,如点击、滑动、拖动等,从而为用户提供更加自由和灵活的交互体验。此外,该对话框还支持手势识别和语音控制等高级交互功能,进一步提升用户的操作便捷性。 再次,超炫Dialog对话框具备强大的功能和扩展性。它可以用于展示各种类型的信息,如文字、图片、音视频等,并可以根据需要灵活地扩展功能。无论是提示、确认、警告还是错误信息,该对话框都能够满足不同场景的需求。 最后,超炫Dialog对话框还具备良好的兼容性和适配性。它可以适配不同尺寸和分辨率的屏幕,保证在不同设备上都能够正常显示和使用。此外,该对话框还兼容不同的操作系统和平台,如Android、iOS等,使得开发者能够在多个平台上灵活使用。 综上所述,超炫Dialog对话框以其炫目、多彩、交互丰富、功能强大、兼容性强等特点,成为了手机应用程序中不可或缺的重要元素,为用户提供了更加优秀的交互和使用体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值