【Android】dialogFragment

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接口

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值