我找到了一些解释为什么Fragment
类应该是static
(不是非静态内部),如this。但无法理解此错误消息的原因:
这个片段类应该是公共的(...)
我使用Android Studio 3.1.2,这是我的代码的一部分:
public class MainActivity extends android.support.v7.app.AppCompatActivity {
// ...
}
class DefaultFragment extends android.support.v4.app.Fragment {
// ...
}
该片段应该只在MainActivity
中使用。
编辑:IDE消息中还有一些其他信息。但是关于构造函数:
从Fragment文档中:
每个片段都必须有一个空构造函数,因此可以在恢复其活动状态时进行实例化。强烈建议子类没有带参数的其他构造函数,因为在重新实例化片段时不会调用这些构造函数。相反,参数可以由调用者使用setArguments(Bundle)提供,稍后由Fragment使用getArguments()检索。
在方向更改时,Activity重新创建,框架在片段上创建新实例(并恢复以前的状态)。所以这里创建Fragment的实例,框架要求提供公共构造函数。
来自Fragment.Fragment()的文档
Default constructor :
每个片段都必须有一个empty constructor
,因此可以在恢复其活动状态时进行实例化。强烈建议子类没有带参数的其他构造函数,因为在重新实例化片段时不会调用这些构造函数。相反,参数可以由调用者用setArguments(Bundle)
提供,然后由Fragment
用getArguments()
检索。
下面是代码形式Activity.java类,你可以进一步分析查看FragmentManager.dispatchMoveToState()的更多代码
@MainThread
@CallSuper
protected void onCreate(@Nullable Bundle savedInstanceState) {
........
if (savedInstanceState != null) {
mAutoFillResetNeeded = savedInstanceState.getBoolean(AUTOFILL_RESET_NEEDED, false);
mLastAutofillId = savedInstanceState.getInt(LAST_AUTOFILL_ID,
View.LAST_APP_AUTOFILL_ID);
if (mAutoFillResetNeeded) {
getAutofillManager().onCreate(savedInstanceState);
}
Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG);
mFragments.restoreAllState(p, mLastNonConfigurationInstances != null
? mLastNonConfigurationInstances.fragments : null);
}
mFragments.dispatchCreate();
.....
}
这也是因为内部类包含对其父类的引用,这可能会泄漏Activity。
非静态内部类确实包含对其父类的引用。使Fragment内部类非静态的问题是您始终保持对Activity的引用。 GarbageCollector无法收集您的活动。因此,如果方向发生变化,您可以“泄漏”活动。因为片段可能仍然存在并插入到新的Activity中。
检查detailed answer和尝试制作片段