例如,我在片段中添加了TextView,如下所示。
var adaptor = new GenericFragmentPagerAdaptor(SupportFragmentManager); // where GenericFragementPagerAdaptor is a sub-class derived from FragementPagerAdaptor
adaptor.AddFragmentView((i, v, b) => {
var view = i.Inflate(Resource.Layout.tab, v, false);
textView = new TextView(view.Context);
textView.Text = "Test1";
view.FindViewById<FrameLayout>(Resource.Id.mainFrame).AddView(textView);
return view;
如果我正在销毁当前活动,则应清除与该片段相关的所有资源。我在哪里以及如何做到这一点?拜托,有人建议我。
答案 0 :(得分:1)
谢谢,
在销毁活动(onDestroy())之前,将调用片段的生命周期方法onDestroyView()和onDetach()。
onDestroyView() - &gt;告诉片段它的视图正在被销毁,以便它可以清理任何相关的资源。
我的建议是一旦下载这个例子并探索片段的所有生命周期方法。
https://github.com/SilverBayTech/FragmentLifeCycle
如果需要进一步的帮助,我将非常感谢您的帮助。
在带有UI的片段中,您经常将一些视图保存为实例状态以加快访问速度。例如,指向EditText的链接,这样您就不必一直findViewById。
问题是View保留对Activity上下文的引用。现在,如果您保留View,则还会保留对该上下文的引用。
如果上下文仍然有效但是典型的保留情况是重新启动Activity,则没有问题。例如,经常用于屏幕旋转。活动重新创建将创建新的上下文,旧的上下文旨在被垃圾收集。但它现在不能被垃圾收集,因为你的Fragment仍然引用旧的。
以下示例显示了如何不这样做
公共类LeakyFragment扩展了Fragment {
private View mLeak; // retained
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mLeak = inflater.inflate(R.layout.whatever, container, false);
return mLeak;
}
@Override
public void onDestroyView() {
super.onDestroyView();
// not cleaning up.
}
}
要解决该问题,您需要在onDestroyView中清除对UI的所有引用。重新使用Fragment实例后,系统会要求您在onCreateView上创建新的UI。在onDestroyView之后保留UI也没有意义。 Ui不会被使用。
此示例中的修复只是更改onDestroyView()方法。
@Override
public void onDestroyView(){
super.onDestroyView();
mLeak = null; // now cleaning up!
}
除了保持对Views的引用之外,你显然不应该保留对Activity的引用(例如来自onAttach - on on onDetach)或任何Context(除非它是Application上下文)。