要确保持有Fragment的Activity实现这个接口, Fragment A 的onAttach()回调方法(当Fragment被添加到Activity时系统调用这个方法)通过类型转换onAttach...@Override public void onAttach(Activity activity) { super.onAttach(activity); try...{ mListener = (onMp3ChangedListener) activity; } catch (ClassCastException e) {...throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener..."); } ... } 如果这个Activity没有实现这个接口,那么Fragment会抛出ClassCastException异常。
哦差点忘了实例化这个对象,我们 需要重写onAttach方法,在Activity与Fragment绑定时实例化(抛出的那个异常是为了在Activity没有实现接口时给个提醒) @Override...public void onAttach(Activity activity) { super.onAttach(activity); try {...mOnRegisterSuccessListener = (OnRegisterSuccessListener) activity; } catch (ClassCastException...e) { throw new ClassCastException(activity.toString() + "must implement
本文从为什么出现Fragment开始,介绍了Fragment相关的方方面面,包括Fragment的基本定义及使用、回退栈的内部实现、Fragment通信、DialogFragment、ViewPager...对应的同步方法为commitNow(),commit()内部会有checkStateLoss()操作,如果开发人员使用不当(比如commit()操作在onSaveInstanceState()之后),可能会抛出异常...,而commitAllowingStateLoss()方法则是不会抛出异常版本的commit()方法,但是尽量使用commit(),而不要使用commitAllowingStateLoss()。...DialogFragment DialogFragment是Android 3.0提出的,代替了Dialog,用于实现对话框。他的优点是:即使旋转屏幕,也能保留对话框状态。...如果要自定义对话框样式,只需要继承DialogFragment,并重写onCreateView(),该方法返回对话框UI。这里我们举个例子,实现进度条样式的圆角对话框。
对应的同步方法为commitNow(),commit()内部会有checkStateLoss()操作,如果开发人员使用不当(比如commit()操作在onSaveInstanceState()之后),可能会抛出异常...,而commitAllowingStateLoss()方法则是不会抛出异常版本的commit()方法,但是尽量使用commit(),而不要使用commitAllowingStateLoss()。...DialogFragment DialogFragment是Android 3.0提出的,代替了Dialog,用于实现对话框。他的优点是:即使旋转屏幕,也能保留对话框状态。...懒加载 懒加载主要用于ViewPager且每页是Fragment的情况,场景为微信主界面,底部有4个tab,当滑到另一个tab时,先显示”正在加载”,过一会才会显示正常界面。...逻辑为:当用户滑到另一个界面,首先会显示正在加载,等数据加载完毕后(这里用睡眠1秒钟代替)显示正常界面。
发现问题 DialogFragment和Activity的通信 我们通常使用DialogFragment来实现弹窗,在其宿主Activity中设置弹窗的点击事件时,如果回调函数中引用了Activity对象...fun onDialogNegativeClick(dialog: DialogFragment) } override fun onAttach(context: Context...) { super.onAttach(context) try { listener = context as NoticeDialogListener...} catch (e: ClassCastException) { throw ClassCastException((context.toString() +...但考虑到DialogFragment的存活周期是宿主Activity的子集,所以这里没有大问题。
为了确保宿主activity实现这个接口,fragment A的onAttach() 方法(这个方法在fragment 被加入到activity中时由系统调用)中通过将传入的activity强制类型转换...@Override public void onAttach(Activity activity) { super.onAttach(activity); try { mListener...= (OnArticleSelectedListener) activity; } catch (ClassCastException e) { throw new ClassCastException...implement OnArticleSelectedListener"); } } ... } 如果activity没有实现这个接口,fragment将会抛出...ClassCastException异常,如果成功了,mListener将会是activity实现OnArticleSelectedListener接口的一个引用,所以通过调用OnArticleSelectedListener
Fragment的一般生命周期如上图所示: onAttach():Fragment和Activity相关联时调用。...他是抽象类,具体的实现类是BackStackRecord 扩展子类: 对话框:DialogFragment 列表:ListFragment 选项设置:PreferenceFragment WebView...对应的同步方法为commitNow(),commit()内部会有checkStateLoss()操作,如果开发人员使用不当(比如commit()操作在onSaveInstanceState()之后),可能会抛出异常...,而commitAllowingStateLoss()方法则是不会抛出异常版本的commit()方法,但是尽量使用commit(),而不要使用commitAllowingStateLoss()。...) activity; } catch (Exception e) { throw new ClassCastException(activity.toString() + "must
等情况下,系统会调用onSaveInstanceState()帮你保存当前Activity的状态、数据等,直到再回到该Activity之前(onResume()之前),你执行Fragment事务,就会抛出该异常...如果想要立即执行,可以在commit之后立即调用FragmentManager的executePendingTransactions()方法. 2. commit()方法必须在状态存储之前调用,否则会抛出异常...低于 23 的版本的时候,是会回调这个方法' @Override public void onAttach(Activity activity) { super.onAttach...DialogFragment: 我们知道现在大家已经很少使用了Dialog类,而是使用了DialogFragment,其本质就是个Fragment。...其实这个本来也想多写点,但是我估计这个基本安卓开发都使用过,所以就直接用网上其他作者的基础介绍文章: Android 必知必会 - DialogFragment 使用总结 同时具体的自定义DialogFragment
3、DialogFragment基类继承RxDialogFragment。...RxLifecycleAndroid.bindFragment(lifecycleSubject); } @Override @CallSuper public void onAttach...(android.app.Activity activity) { super.onAttach(activity); lifecycleSubject.onNext(FragmentEvent.ATTACH
要想实现一个更加完善的对话框,需要在自定义对话框时继承DialogFragment类。下面用一个简单的提示对话框进行说明,该对话框主要是显示一段文字,然后由用户选择“确定”或者“取消”。...其次在该实例加入到activity页面时(onAttach方法),设置回调接口,并从getArguments()中取出参数信息。...args.putString("message", message); frag.setArguments(args); return frag; } @Override public void onAttach...(Activity activity) { super.onAttach(activity); if (!...文件对话框与上面的提示对话框一样,也是从DialogFragment类继承而来,主要步骤与ConfirmDialogFragment大同小异,其主要难点在于文件和文件夹的处理。
1.3 Fragment的使用相关 使用Fragment时,需要继承Fragment或者Fragment的子类(DialogFragment, ListFragment, PreferenceFragment...@Override public void onAttach(Activity activity) { super.onAttach(activity); try...{ mListener = (OnArticleSelectedListener) activity; }catch(ClassCastException e)...Fragment还有一些额外的生命周期回调函数: onAttach() 当fragment和activity被关联时调用。...注意:你只能在activity存储它的状态(当用户要离开activity时)之前调用commit(),如果在存储状态之后调用commit(),将会抛出一个异常。
fm.findFragmentById(R.id.NewFragment); 容器Activity可以实现Fragment类中定义的一个接口,同时在Fragment类中定义该接口类型的一个成员,在重载的onAttach...} /** * 事件接口实例 */ private OnXXXListener onXXXListener; @Override public void onAttach...(Activity activity) { super.onAttach(activity); try { onXXXListener =...(OnXXXListener)activity;//获取容器Activity } catch (ClassCastException e) { throw...new ClassCastException( activity.toString() + "must inplement OnXXXListener"
dialogFragment = new FragmentDlg(); dialogFragment.show(getSupportFragmentManager(), "");...虽然被杀死了,但是onCreate函数在执行的时候还是只执行了一次啊,为什么会出现两个DialogFragment,这里其实就有一个DialogFragment是通过Android自身的恢复重建机制重建出来...instantiate,最后通过反射,构建Fragment,也就是,被加到FragmentActivity的Fragment在恢复的时候,会被自动创建,并且采用Fragment的默认无参构造方法,如果没哟这个方法,就会抛出...The * first place application code an run where the fragment is ready to * be used is in {@link #onAttach...下面再来看下为什么会出现两个DialogFragment。
除了继承基类 Fragment , 还有一些子类你可能会继承: DialogFragment 显示一个浮动的对话框....) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString...implementOnArticleSelectedListener”); } } … } 如果activity没有实现接口, fragment会抛出...ClassCastException 异常....onDestroyView() 当和fragment关联的view hierarchy正在被移除时调用.
dialog.setCanceledOnTouchOutside(false); return dialog; } @Override public void onAttach...(Activity activity) { super.onAttach(activity); if (!...(activity instanceof DialogListener)) { throw new ClassCastException(activity.toString()...(Activity activity) { super.onAttach(activity); if (!...(activity instanceof DialogListener)) { throw new ClassCastException(activity.toString()
都应该由 Activity 来完成;不能是多个 Fragment 之间直接通信 Fragment与其附着的Activity之间通信方式: 在发起事件的Fragment中定义一个接口,接口中声明你的方法 在onAttach...} private OnNewItemAddedListener onNewItemAddedListener; private Button btnAddItem; /*复写onAttach...方法*/ @Override public void onAttach(Activity activity) { super.onAttach(activity);...try { onNewItemAddedListener = (OnNewItemAddedListener) activity; } catch (ClassCastException...e){ throw new ClassCastException(activity.toString() + "must implement OnNewItemAddedListener
savedInstanceState) { super.onActivityCreated(savedInstanceState); } @Override public void onAttach...IBtnCallListener) activity; } catch (Exception e) { // TODO: handle exception throw new ClassCastException...(activity.toString() + "must implement mbtnListener"); } super.onAttach(activity); }