【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 dialogdialog.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);//显示位置
相关文章推荐
- Android UI学习 - 对话框 (AlertDialog & ProgressDialog)
- Android应用开发学习笔记之AlertDialog对话框
- Android UI学习 - 对话框 (AlertDialog & ProgressDialog) 推荐
- Android UI学习 - 对话框 (AlertDialog & ProgressDialog)
- Android UI学习 - 对话框 (AlertDialog & ProgressDialog)
- Android学习——Dialog对话框
- Android应用开发学习之AlertDialog对话框
- Android UI学习 - 对话框 (AlertDialog & ProgressDialog)
- Android UI学习 - 对话框 (AlertDialog & ProgressDialog)
- Android UI学习 - 对话框 (AlertDialog & ProgressDialog)
- Android基础之AlertDialog(对话框)的学习
- Android UI学习 - 对话框 (AlertDialog & ProgressDialog)
- Android学习(十九)Dialog对话框
- Android UI学习 - 对话框 (AlertDialog & ProgressDialog)
- Android基础控件之-----------对话框Dialog(学习笔记)
- Android笔记:Android UI学习 - 对话框 (AlertDialog & ProgressDialog)
- android 开发零起步学习笔记(二十三): Android 对话框AlertDialog和AlertDialog.Builder两者的区别
- Android UI学习 - 对话框 (AlertDialog & ProgressDialog)2010-06-16 18:17:21
- Android学习—自定义对话框Dialog
- Android UI学习 - 对话框 (AlertDialog & ProgressDialog)