您的位置:首页 > 移动开发 > Android开发

【android学习】Dialog对话框

2017-09-04 15:37 351 查看

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>


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);//显示位置
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: