资料阅读
Android常用对话框大全——Dialoghttps://blog.csdn.net/a_zhon/article/details/54578047
了解dialog的类别和使用
http://www.cnblogs.com/xiaoluo501395377/p/3419398.html
http://www.cnblogs.com/xiaoluo501395377/p/3421727.html
实现一个自定义的dialog
https://blog.csdn.net/Small_Lee/article/details/50602400
https://blog.csdn.net/small_lee/article/details/50602500
progressBar和progressDialog的使用
https://blog.csdn.net/hardworkingant/article/details/71910731
新版本谷歌推荐用dialogFragment来替代dialog和相关的子类,能更好的管理窗口的生命周期以及在屏幕切换的时候,及时的保存数据
资料参考 https://blog.csdn.net/xiangzhihong8/article/details/38294059
小实践:设置一个浮空的progressBar(DialogFragment)
布局文件
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_remind"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:text="@string/wait_please_qsh"
app:layout_constraintBottom_toBottomOf="@+id/progressBar"
app:layout_constraintEnd_toStartOf="@+id/progressBar"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/progressBar" />
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:layout_marginEnd="8dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="16dp"
android:indeterminate="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
dialogFragment
重写oncancle()和onDismiss()
public class ProgressBarFragment extends DialogFragment {
private static final String TAG = "LogUtil.ProgressBarFt";
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.progress_bar_no_click,container);
}
@Override
public void onCancel(DialogInterface dialog) {
LogUtil.i(TAG, "onCancel: ");
super.onCancel(dialog);
}
@Override
public void onDismiss(DialogInterface dialog) {
LogUtil.i(TAG, "onDismiss: ");
super.onDismiss(dialog);
}
}
调用
ProgressBarFragment progressBar=new ProgressBarFragment();
progressBar.show(getSupportFragmentManager(),"inquireCustomDuplicate");
实现效果
还可以设置更多效果
可以设置dialog的窗口透明,这样就只会显示一个progressbar,不会有背景的白色
设置背景不会变暗,这样看起来,就像是一个活动内的progressbar
可以设置dialog不可取消,这样可以禁止客户重复进行一些操作
在onstart()中设置
@Override
public void onStart() {
super.onStart();
Dialog dialog=getDialog();
if (dialog!=null){
dialog.setCancelable(false);
Window window=dialog.getWindow();
// 摄者背景透明
assert window != null;
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
// 设置dialog出现时,背景不会变暗
WindowManager.LayoutParams lp=window.getAttributes();
lp.dimAmount=0f;
window.setAttributes(lp);
// 取消window的悬浮效果(在取消上面的背景阴影后,dialog本身也不是透明时,dialog在v21自带一个悬浮效果,这个可以取消悬浮效果)
window.setElevation(0);
}
}
填坑:
1,怎么设置diolog的宽度
//获得屏幕的实例
Display d=getWindowManager().getDefaultDisplay();
//获得窗体的属性
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
//设置Dialog距离底部的距离
lp.y = 20;
//设置diolog的宽度位屏幕宽度
Point point=new Point();
d.getSize(point);
lp.width=point.x;
//将属性设置给窗体
dialogWindow.setAttributes(lp);
获取屏幕宽度
可以通过Point=d.getSize(),point.x和point.y就是屏幕的宽度和高度
也可以直接通过安卓内置的参数
LayoutParams.match_Parent或者LayoutParams.wrap_content.
https://blog.csdn.net/liuhaomatou/article/details/22899925/
2.设置一个AlertDialog
AlertDialog.Builder builder=new AlertDialog.Builder(getContext());
builder.setMessage("确定退出吗");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getContext(), "确定退出", Toast.LENGTH_SHORT).show();
OkHttp3Utils.sendHttpLoginOutRequest(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()){
String strResponse=response.body().string();
LogU.i(TAG, "onResponse: response="+strResponse);
System.exit(0);
}
}
});
}
});
builder.setNegativeButton("取消", null);
builder.show();
参考如何通过dialog退出程序
https://www.jb51.net/article/79128.htm
dialogFragment d的再学习
资料 详细解读DialogFragment - 千个太阳在手中 - 博客园
创建dialogView
有两种方式,一个是重写fragment内部的onCreateView()方法,另一个是重写内部的onCreateDialog()
从生命周期来看,onCreateDailo()在前,onCreateDialog()在后,但是不要同时使用这两个方法
使用DialogFragment
show(FragmentManager manager,Tag tag)
new DialogFragmentTest()
.show(getFragmentManager(), "dialog_fragment");
如何让Fragment和activity通信
让activity实现一个接口,在Fragment中通过getActivity()获取活动,并调用活动实现的接口方法,把数据传递出去.
DialogFragment的生命周期以及执行顺序
onAttach
onCreate
onCreateDialog
onCreateView
onstart
在摸索的过程中发现的小技巧
1 执行了onCreateDialog会覆盖onCreateView
2 执行onCreateView,相当于是在一个默认的Dialog中填充自己的View
这个Dialog有标题,可以在onCreateView()中通过代码去除
getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);
修改dialog的宽度
Android 自定义 DialogFragment 宽度问题_ 玄月初心的博客-CSDN博客_dialogfragment 宽度
默认Dialog的大小是wrap方式的,如果需要设置dialog窗口的大小和摆放位置,需要重写onStart()方法,在onCreateView中重写无效
@Override
public void onStart() {
Dialog dialog = getDialog();
if (dialog!=null){
Window window=getDialog().getWindow();
// 设置窗口大小
window.setLayout(DataUtil.windowWidth, WindowManager.LayoutParams.WRAP_CONTENT);
// 设置窗口的位置
window.setGravity(Gravity.BOTTOM);
// 设置窗口的背景为透明
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
// 设置窗口距离底部50
WindowManager.LayoutParams lp = window.getAttributes();
lp.y=50;
window.setAttributes(lp);
}
super.onStart();
}