Android编程权威指南(第二版)第十二章-对话框
对话框既能引起用户的注意也可接收用户的输入。在提示重要信息或提供用户选项方面,它都非常有用。 比如,我们在填写日期信息时,一般会弹出一个日历表界面,然后用户只需点击就可以输入日期。,这里以得到日期为例子。
对话框是AlertDialog类的一个实例。实际开发中, AlertDialog类是个常用的多用途Dialog子类。
第一步,添加使用AppCompat兼容库
在项目的结构中添加appcompat-v7依赖项,在使用的时候导入 android.support.v7.app.AlertDialog包,Android操作系统有内置的AlertDialog,但是使用兼容版本会更加美观。
第二步,创建DialogFragment
public class **Fragment extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity())
.setTitle(“标题”)
.setPositiveButton(android.R.string.ok, null) //设置一个可以点击的确认按钮,第二个参数,用于监听器接口
.create();//返回配置完成的AlertDialog实例,完成对话框的创建。
}
}
以上代码中,使用AlertDialog.Builder类,以流接口(fluent interface)的方式创建了AlertDialog实例。
第三步,显示 DialogFragment
和其他fragment一样, DialogFragment实例也是由托管activity的FragmentManager管理着的。要将DialogFragment添加给FragmentManager管理并放置到屏幕上,可调用fragment实例的以下方法:
public void show(FragmentManager manager, String tag)
public void show(FragmentTransaction transaction, String tag)
string参数可唯一识别FragmentManager队列中的DialogFragment。两个方法任你选:如传入FragmentTransaction参数,你自己负责创建并提交事务;如传入FragmentManager参数,系统会自动创建并提交事务。
第四步,创建布局文件,设置对话框的显示内容
<DatePicker
Android:id="@+id/dialog_date_picker"
android:calendarViewShown="false"
...../>
使用AlertDialog.Builder的setView(...) 方 法,添加DatePicker组件给AlertDialog对话框:public AlertDialog.Builder setView(View view).在DialogFragment 类中的onCreateDialog中得到布局视图文件,并set给Dialog.
public Dialog onCreateDialog(Bundle savedInstanceState) {
View v = LayoutInflater.from(getActivity())
.inflate(R.layout.dialog_date, null);//得到布局文件
return new AlertDialog.Builder(getActivity())
.setView(v)
.setTitle(R.string.date_picker_title)
.setPositiveButton(android.R.string.ok, null)
.create();
}
注意,在上边的布局文件中有一个calendarViewShown属性,日历选择界面是随Material design版本引入的DatePicker会忽略这个属性,如果是旧版本才会使用这个属性。
第五步,fragment之间的数据传递,使得进入DatePicker时,可以直接选择到默认的date,同时,用户修改date后,能返回得到用户的日期设置。
首先在DialogFragment 中写一个带date参数的newIntent构造方法,把date放进参数中
public class DatePickerFragment extends DialogFragment {
private static final String ARG_DATE = "date";
public static DatePickerFragment newInstance(Date date) {
Bundle args = new Bundle();
args.putSerializable(ARG_DATE, date);
DatePickerFragment fragment = new DatePickerFragment();
fragment.setArguments(args);
return fragment;
}
}
然后在DatePickerFragment中,得到参数,并调用init函数对显示的日期初始化
public Dialog onCreateDialog(Bundle savedInstanceState) {
Date date = (Date) getArguments().getSerializable(ARG_DATE);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);//得到年月日
View v = LayoutInflater.from(getActivity())
.inflate(R.layout.dialog_date, null);
mDatePicker = (DatePicker) v.findViewById(R.id.dialog_date_picker);
mDatePicker.init(year, month, day, null);
return new AlertDialog.Builder(getActivity())
.setView(v)
.setTitle(R.string.date_picker_title)
.setPositiveButton(android.R.string.ok, null)
.create();
}
用户选择了新的日期,并点击ok按钮放回,那么我们如何将这个日期返回给fragment呢?
在这本书中使用 startActivityForResult onActivityResult设计结果代码,来传输数据
请求代码:与传入setTargetFragment(...)方法相匹配,告诉目标fragment返回结果来
自哪里。
结果代码:决定下一步该采取什么行动。
Intent: 包含extra数据。
还记得在DatePickerFragment中流式创建AlertDialog中.setpostiveButton中,不是留有一个空白的监听器吗?这次把监听器配置好,把用户选择的date当做参数,那么选择日期,点击确定后就可以放回了。
.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
int year = mDatePicker.getYear();
int month = mDatePicker.getMonth();
int day = mDatePicker.getDayOfMonth();
Date date = new GregorianCalendar(year, month, day).getTime();
sendResult(Activity.RESULT_OK, date);
}
})

浙公网安备 33010602011771号