对话框是提示用户作出决定或输入额外信息的小窗口。对话框不会填充屏幕,通常用于需要用户采取行动才能继续执行的模式事件。Android中常见跟对话框相关控件有Toast、AlertDialog、PopupWindow、ProgressDialog等
Toast用于弹出一个简单文本信息为应用提供反馈,可以和当前活动保持可见和互动,在一定时间后自动消失。Toast有两种形式基本Toast和自定义Toast,效果如图2.5.1-1所示:
图2.5.1-1
1、基本Toast的实现
首先通过makeText()实例化一个Toast,然后调用show()进行显示,代码实现:
Toast toast = Toast.makeText(context, “请检查网络连接”,
Toast.LENGTH_SHORT.);
toast.show();
2、自定义Toast
如果一个简单的文本信息是不够的,可以为Toast自定义布局并可以设置在屏幕上的显示位置。
Ø 要创建一个自定义布局,定义视图的布局
Ø 通过setView()方法加载布局。
下面就通过案例2.5-1,实现如图2.5-1所示的应用效果
图2.5-1
AlertDialog是Dialog的子类,可实现简单、方便、灵活的构建对话框。AlertDialog可显示标题、最多三个按钮、可选择项列表或自定义布局。AlertDialog
主要有三个布局区域如图2.5-2所示:
图2.5-2
AlertDialog实现要点
Ø 实现向AlertDialog添加按钮
通过调用 setPositiveButton() 和 setNegativeButton() 方法实现为对话框添加按钮,代码如下:
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setPositiveButton(“ok”, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
}
});
builder.setNegativeButton(“cancel”, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
}});
Ø 创建自定义布局
想让对话框具有自定义布局,需创建一个布局,然后通过调AlertDialog.Builder对象上的 setView()将其添加到 AlertDialog,代码如下:
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = getActivity().getLayoutInflater();
builder.setView(inflater.inflate(R.layout.dialog_signin, null));
默认情况下,自定义布局会填充对话框窗口,但仍然可以使用 AlertDialog.Builder 方法来添加按钮和标题。
下面就通过案例2.5-2,实现如图2.5-3 所示的应用效果
图2.5-3
PopupWindow是可在任意位置弹出的对话框,在当前活动的Activity的顶部显示一个浮动的容器。AlertDialog与PopupWindow的区别:
Ø AlertDialog的位置固定,而PopupWindow的位置可以随意。
Ø AlertDialog是非阻塞线程的,而PopupWindow是阻塞线程的。
PopupWindow的实现:
Ø 构建PopupWindow
View view= LayoutInflater.from(this).inflate(
R.layout.popuwindow_layout,null);
mPopupWindow=new PopupWindow(view);
Ø 设置PopupWindow
1、单击外侧区域关闭PopupWindow
显示PopupWindow之后在外面点击是关闭窗口需进行下列设置,否则点击外面并不会关闭PopupWindow。
mPopupWindow.setFocusable(true);
ColorDrawable colorDrawable=new ColorDrawable(0);
mPopupWindow.setBackgroundDrawable(colorDrawable);
2、为popupwindow添加动画
首先在anim中定义动画资源,并在Style中定义样式然后使用setAnimationStyle()方法为PopupWindow添加动画,代码如下:
进入动画:
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:fromAlpha="0"
android:toAlpha="1"
android:duration="1000"
/>
</set>
退出动画:
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha android:duration="1000"
android:fromAlpha="1" android:toAlpha="0"/>
</set>
定义样式:
<style name="popuAnimationStyle">
<item name="android:windowEnterAnimation">@anim/popup_enter
</item>
<item name="android:windowExitAnimation">@anim/popup_out</item>
</style>
设置动画
mPopupWindow.setAnimationStyle(R.style.popuAnimationStyle);
Ø 弹出PopupWindow
showAsDropDown(view):相对某个控件的位置(正左下方),无偏移
showAsDropDown(view, xoff, yoff):相对某个控件的位置,有偏移
showAsDropDown(view, xoff, yoff, gravity):相对某个控件的指定位置,有偏移
showAtLocation(parent, gravity, x, y):相对于父控件的指定位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移
下面就通过案例2.5-3,讲解PopupWindow的用法
1、实现在控件的正下方弹出菜单
带有进度条(Progressbar)的对话框,该对话框只能显示一个文本或一个View加上一个进度条,但文本和View不能同时使用。如果显示不确定的进度(圆形进度条),则不建议使用ProgressDialog,而应改为在Activity布局中使用
ProgressDialog的几个方法
1.setMax()
设置对话框中进度条的最大值, 进度的取值范围为0..10000。
2.setTile()
设置标题。
3.setProgressStyle()
设置对话框中进度条的样式。例如:环形和水平。
参数:
ProgressDialog.STYLE_SPINNER 环形精度条。
ProgressDialog.STYLE_HORIZONTAL 水平样式的进度条。
4.setMessage()
设置显示的内容。
下面就通过案例2.5-4,讲解ProgressDialog的用法,执行效果如图2.5-4
图2.5-4
提示:本例中用于异步任务,请参阅AsyncTask的用法请参阅《第三章 事件处理》异步任务相关内容
public class ProgressDialogActivity extends AppCompatActivity { private ProgressDialog progressDialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_progress_dialog); showProgressDialog(); new UpdateAsyncTask().execute(); } private void showProgressDialog(){ //创建ProgressDialog progressDialog = new ProgressDialog(ProgressDialogActivity.this); //设置ProgressDialog的样式 progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); //设置标题 progressDialog.setTitle("软件更新"); //设置显示的内容 progressDialog.setMessage("正在下载"); //设置最大值 progressDialog.setMax(100); //设置进度值 progressDialog.setProgress(0); //显示对话框 progressDialog.show(); } private Integer progress=0; private class UpdateAsyncTask extends AsyncTask<Void,Integer,Void>{ @Override protected Void doInBackground(Void... params) { //模拟网络操作。 while(progress<100){ try { Thread.sleep(1000); progress+=10; publishProgress(progress); } catch (InterruptedException e) { e.printStackTrace(); } } return null; } @Override protected void onPostExecute(Void aVoid) { //执行完成之后,关闭对话框。 progressDialog.dismiss(); } @Override protected void onProgressUpdate(Integer... values) { Log.d("jereh","dfdfdf"); super.onProgressUpdate(values); //更改进度条的值 progressDialog.setProgress(values[0]); } }
代码参考:
codes\ch02\2.5\CustomDialog\app\src\main\java\com\jerehedu\ProgressDialogActivity.java