1.DialogFragment是用于展示弹窗的API。
2. 分为 v4 包下的和android.app 包下的,我们使用 v4 包下的, android.app 包下的DialogFragment 在 Android28 版本上已经被标记为弃用了。承与 Fragment ,拥有 Fragment 所有的特性。
3. DialogFragment 里面内嵌了一个 Dialog。
创建方法:
-重写 onCreateDialog
(1)xml文件:略
(2)创建IndexActivity.java
public class IndexActivity extends AppCompatActivity {
private RadioGroup mRadioGroupDialogType;
private Button mButtonCreateDialog;
public static final int DIALOG_TYPE_ALTER = 1;
public static final int DIALOG_TYPE_DATE = 2;
public static final int DIALOG_TYPE_TIME = 3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_index);
mRadioGroupDialogType = (RadioGroup) findViewById(R.id.rad_dialog_type);
mButtonCreateDialog =(Button) findViewById(R.id.rad_dialog_btn);
mButtonCreateDialog.setOnClickListener(new View.OnClickListener() {
@SuppressLint("NonConstantResourceId")
@Override
public void onClick(View v) {
int resId = mRadioGroupDialogType.getCheckedRadioButtonId();
RicoDialogFragment ricoDialogFragment = null;
switch(resId){
case R.id.rad_dialog_alter:
ricoDialogFragment = RicoDialogFragment.getInstance(DIALOG_TYPE_ALTER);
break;
case R.id.rad_dialog_data:
ricoDialogFragment = RicoDialogFragment.getInstance(DIALOG_TYPE_DATE);
break;
case R.id.rad_dialog_time:
ricoDialogFragment = RicoDialogFragment.getInstance(DIALOG_TYPE_TIME);
break;
default:break;
}
if(ricoDialogFragment != null){
ricoDialogFragment.show(getSupportFragmentManager(),"信息");
}
}
});
}
}
(3)创建RicoDialogFragment.java
public class RicoDialogFragment extends DialogFragment {
public static RicoDialogFragment getInstance(int type){
RicoDialogFragment dialog = new RicoDialogFragment();
Bundle bundle = new Bundle(); //Bundle主要用于传递数据;它保存的数据,是以key-value(键值对)的形式存在的
bundle.putInt("Dialog_Type",type);
dialog.setArguments(bundle);
return dialog;
}
@SuppressLint("SetTextI18n")
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
assert getArguments() != null;
int dialog_type = getArguments().getInt("Dialog_Type");
switch (dialog_type) {
//alter 对话框
case IndexActivity.DIALOG_TYPE_ALTER:
return new AlertDialog.Builder(getActivity())
.setIcon(R.drawable.dialogfragment_icon)
.setTitle(getTag()) //getTag调用的时候传值
.setMessage("今天你努力了吗?")
.setPositiveButton("确定", (arg0, arg1) ->
Toast.makeText(getActivity(), "加油", Toast.LENGTH_SHORT).show())
.setNegativeButton("取消", (arg0, arg1) ->
Toast.makeText(getActivity(), "再接再厉", Toast.LENGTH_SHORT).show()).create();
//date 日历表
case IndexActivity.DIALOG_TYPE_DATE:
Calendar c1 = Calendar.getInstance();
int year = c1.get(Calendar.YEAR);
int monthOfYear = c1.get(Calendar.MONTH);
int dayOfMonth = c1.get(Calendar.DAY_OF_MONTH);
return new DatePickerDialog(getActivity(), (view, selectedYear, selectedMonth, selectedDay) -> {
Toast.makeText(getActivity(),selectedYear + "年" + (selectedMonth+1) +
"月" + selectedDay + "日",Toast.LENGTH_SHORT).show();
//在fragment中获得他附着的activity的UI控件
TextView txtResult = (TextView) Objects.requireNonNull(getActivity()).findViewById(R.id.rad_dialog_txt);
txtResult.setText(selectedYear + "年" + (selectedMonth+1) +
"月" + selectedDay + "日");
},year,monthOfYear,dayOfMonth);
//time 时间
case IndexActivity.DIALOG_TYPE_TIME:
Calendar c2 = Calendar.getInstance();
int hourOfDay = c2.get(Calendar.HOUR_OF_DAY);
int minute= c2.get(Calendar.MINUTE);
return new TimePickerDialog(getActivity(), new TimePickerDialog.OnTimeSetListener() {
@SuppressLint("SetTextI18n")
@Override
public void onTimeSet(TimePicker view, int selectedHour, int selectedMinute) {
Toast.makeText(getActivity(),selectedHour + ":" + selectedMinute ,Toast.LENGTH_SHORT).show();
TextView txtResult = (TextView) Objects.requireNonNull(getActivity()).findViewById(R.id.rad_dialog_txt);
txtResult.setText(selectedHour + "时" + selectedMinute + "分");
}
},hourOfDay,minute,true);
}
return null;
}
}
(4)效果展示
dialog
(5)知识点
getInstance():
①.可以直接使用,调用多次返回同一个对象
②.getInstance往往是static的
③.对象使用之前通过getInstance得到而不需要自己定义,用完之后不需要delete
④.对于抽象类,要想对其实例化,只能用getInstance方法,不能使用new
⑤.getInstance()可以跨栈区域使用,或者远程跨区域使用
⑥.getInstance这个方法在单例模式用的甚多,为了避免对内存造成浪费,直到需要实例化该类的时候才将其实例化,所以用getInstance来获取该对象。
单例模式:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
Bundle:
①.主要用于传输数据,以key-value的形式存储数据
②.当bundle传递的是对象或对象数组时,必须实现Serializable或Parcelable接口