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);
    }
  })

posted @ 2017-03-10 11:48  HeLing_CC  阅读(122)  评论(0)    收藏  举报