Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

View reuse in fragments android

I am trying to save my View states in my fragment but I am concerned I make be leaking my Activity. Here is what I am doing:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state){
   if(mView != null){
      View oldParent = mView.getParent();
      if(oldParent != container){
         ((ViewGroup)oldParent).removeView(mView);
      }
      return mView;
   }
   else{
      mView = inflater.inflate(R.id.fragview, null)
      return mView;
   }
}

I am concerned because I know all Views hold onto a context and I don't know if it is the Activity context or Application context if inflated from the inflater. Perhaps it would be a better idea to pragmatically create the view and set its attributes using getActivity().getApplication() rather than use the inflater. I would appreciate any feedback on this.

Thanks!

EDIT: Confirmed Activity leak, although this code works great don't do it :*(

like image 886
Nathan Schwermann Avatar asked Mar 27 '11 19:03

Nathan Schwermann


2 Answers

I am trying to save my View states in my fragment but I am concerned I make be leaking my Activity.

Use onSaveInstanceState() (in the fragment) and onRetainConfigurationInstance() (in the activity) for maintaining "View states" across configuration changes. I am not quite certain what other "View states" you might be referring to.

I am concerned because I know all Views hold onto a context and I don't know if it is the Activity context or Application context if inflated from the inflater.

Since using the Application for view inflation does not seem to work well, you should be inflating from the Activity. And, hence, the views will hold a reference to the Activity that inflated them.

like image 90
CommonsWare Avatar answered Nov 15 '22 06:11

CommonsWare


@schwiz é have implemented something similar.

I use the setRetainInstance in the fragment. on the fragment layout I have a FrameLayout placeholder where I put my webView inside.

This webView is created programmatically on the Fragment's onCreate using the Application Context, and I do a addView(webView) on the inflated layout in onCreateView().

webView = new WebView(getActivity().getApplicationContext());

And on onDestroyView I simply remove the webView from my framelayout placeholder.

It work really well, unless you try to play a video in fullscreen. That doesn't work because it expects an Activity Context

like image 1
luciofm Avatar answered Nov 15 '22 07:11

luciofm