onAttach()不在Fragment中调用
从AppCompatActivity
启动时,My Fragment不会调用onAttach(context)
方法。
在XML中创build片段:
<fragment android:id="@+id/toolbar" class="package.MainToolbarFragment" android:layout_width="match_parent" android:layout_height="wrap_content" tools:layout="@layout/fragment_main_toolbar" />
但是,如果我从support.v4.Fragment
扩展它, onAttach(context)
调用!
可能是什么问题呢?
当然,我可以扩展来自v4.Fragment
所有片段,但我不想要它。 这是不好的做法吗? 另外项目分钟sdk 14。
它没有被调用,因为这个方法已经被添加到API 23中。如果你在API 23(棉花糖)的设备上运行你的应用程序,那么onAttach(Context)
将被调用。 在所有以前的Android版本onAttach(Activity)
都会被调用。
http://developer.android.com/reference/android/app/Fragment.html#onAttach(android.app.Activity);
支持库片段是独立于平台的。 因此它适用于所有的API版本。
Google希望我们停止使用已弃用的API
@Override public void onAttach(Context context) { super.onAttach(context); ...
是如此新,以至于不被广泛的称呼。 你还需要执行
@Override public void onAttach(Activity activity) { super.onAttach(activity); ...
对我来说,他们是相同的,但我喜欢KISS和介绍另一个支持库往往使我的apk翻倍到大约1000kb。 我昨天只更新了我的SDK。
在许多情况下,types在这里不可互换的原因是,当提供一个Activity
时,采用一个Activity
的方法仍然会被调用,因为它们都是公开可见的,而Activity
比(作为) Context
将优先。
除了前面提到的评论之外,我认为还有一点很重要,如果你试图用onAttach()
从父Activity中更新片段中包含的数据,可能会遇到问题,当片段被充气时,活动为空或空。 在您的Activity的生命周期中的某个时刻,您的数据模型可能会发生变化,需要在片段中进行更新。 您可能试图获得对已经膨胀的片段的引用,但是在遍历代码时,即使使用包含Context或Activity对象的覆盖, onAttach()
也不会触发。
如果您正在尝试为片段创build侦听器,并使用onAttach()
callback方法初始化侦听器,则除非您在向Activity中添加片段时提供如下所示的tag参数,否则onAttach()
将不会触发:
// in the Activity getFragmentManager().beginTransaction() .add( R.id.fragmentContainer, CustomFragment.newInstance(customDataSource), CustomFragment.TAG // Must be passed in for the code below to work ).commit(); // Getting a reference to the fragment later on (say to update your data model inside the fragment (in onActivityResult()) CustomFragment fragmentDelegate = (CustomFragment) getFragmentManager().findFragmentByTag(CustomFragment.TAG); fragmentListener.updateDataSource(customDataSource);