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