title: How to fix memory leak issue in Frame Layout?
body: <p>I am using leakcanary in my android app and it detects <strong>FrameLayout Leaked</strong>. But I can't find or fix this issue,</p>
  <p>How can I fix this leak? Ref my leak canary report.
  <strong>FrameLayout Leaked</strong></p>
  <pre><code> ┬───
      │ GC Root: System class
      │
      ├─ leakcanary.internal.InternalLeakCanary class
      │    Leaking: NO (MainActivity↓ is not leaking and a class is never leaking)
      │    ↓ static InternalLeakCanary.resumedActivity
      ├─ com.android.zigmaster.MainActivity instance
      │    Leaking: NO (MapViewFragment↓ is not leaking and Activity#mDestroyed
      │    is false)
      │    mApplication instance of com.android.zigmaster.MyApplication
      │    mBase instance of androidx.appcompat.view.ContextThemeWrapper
      │    ↓ ComponentActivity.mActivityResultRegistry
      ├─ androidx.activity.ComponentActivity$2 instance
      │    Leaking: NO (MapViewFragment↓ is not leaking)
      │    Anonymous subclass of androidx.activity.result.ActivityResultRegistry
      │    this$0 instance of com.android.zigmaster.MainActivity with mDestroyed =
      │    false
      │    ↓ ActivityResultRegistry.mKeyToCallback
      ├─ java.util.HashMap instance
      │    Leaking: NO (MapViewFragment↓ is not leaking)
      │    ↓ HashMap.table
      ├─ java.util.HashMap$HashMapEntry[] array
      │    Leaking: NO (MapViewFragment↓ is not leaking)
      │    ↓ HashMap$HashMapEntry[].[4]
      ├─ java.util.HashMap$HashMapEntry instance
      │    Leaking: NO (MapViewFragment↓ is not leaking)
      │    ↓ HashMap$HashMapEntry.value
      ├─ androidx.activity.result.ActivityResultRegistry$CallbackAndContract instance
      │    Leaking: NO (MapViewFragment↓ is not leaking)
      │    ↓ ActivityResultRegistry$CallbackAndContract.mCallback
      ├─ androidx.fragment.app.FragmentManager$10 instance
      │    Leaking: NO (MapViewFragment↓ is not leaking)
      │    Anonymous class implementing androidx.activity.result.
      │    ActivityResultCallback
      │    ↓ FragmentManager$10.this$0
      ├─ androidx.fragment.app.FragmentManagerImpl instance
      │    Leaking: NO (MapViewFragment↓ is not leaking)
      │    ↓ FragmentManager.mParent
      ├─ com.android.zigmaster.ui.trips.FragmentTripPlanner instance
      │    Leaking: NO (Fragment#mFragmentManager is not null)
      │    ↓ FragmentTripPlanner.mMap
      │                          ~~~~
      ├─ com.google.android.gms.maps.GoogleMap instance
      │    Leaking: UNKNOWN
      │    Retaining 765.4 kB in 10828 objects
      │    ↓ GoogleMap.zzg
      │                ~~~
      ├─ com.google.android.gms.maps.internal.zzg instance
      │    Leaking: UNKNOWN
      │    Retaining 142 B in 2 objects
      │    ↓ zza.zza
      │          ~~~
      ├─ com.google.maps.api.android.lib6.impl.bn instance
      │    Leaking: UNKNOWN
      │    Retaining 765.0 kB in 10821 objects
      │    A instance of com.android.zigmaster.MyApplication
      │    ↓ bn.w
      │         ~
      ├─ android.widget.FrameLayout instance
      │    Leaking: UNKNOWN
      │    Retaining 2.9 kB in 65 objects
      │    View not part of a window view hierarchy
      │    View.mAttachInfo is null (view detached)
      │    View.mWindowAttachCount = 1
      │    mContext instance of com.android.zigmaster.MyApplication
      │    ↓ View.mParent
      │           ~~~~~~~
      ╰→ android.widget.FrameLayout instance
      ​     Leaking: YES (ObjectWatcher was watching this because com.google.android.
      ​     gms.maps.SupportMapFragment received Fragment#onDestroyView() callback
      ​     (references to its views should be cleared to prevent leaks))
      ​     Retaining 1.9 kB in 48 objects
      ​     key = 265fafb3-b2a3-4462-a4e7-d5cc2afbc6fe
      ​     watchDurationMillis = 57439
      ​     retainedDurationMillis = 52422
      ​     View not part of a window view hierarchy
      ​     View.mAttachInfo is null (view detached)
      ​     View.mWindowAttachCount = 1
      ​     mContext instance of com.android.zigmaster.MainActivity with
      ​     mDestroyed = false
      
     
  </code></pre>
  <p>Here is my xml code:
  <strong>XML:</strong></p>
  <pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
  &lt;androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
      xmlns:tools=&quot;http://schemas.android.com/tools&quot;
      android:layout_width=&quot;match_parent&quot;
      android:layout_height=&quot;match_parent&quot;
      tools:context=&quot;.ui.trips.FragmentTripPlanner&quot;&gt;
  
  
      &lt;androidx.fragment.app.FragmentContainerView
          android:id=&quot;@+id/map&quot;
          android:name=&quot;com.google.android.gms.maps.SupportMapFragment&quot;
          android:layout_width=&quot;match_parent&quot;
          android:layout_height=&quot;match_parent&quot; /&gt;
  
  &lt;/androidx.coordinatorlayout.widget.CoordinatorLayout&gt;
  </code></pre>
  <p>Here is my fragment
  <strong>Fragment:</strong></p>
  <pre><code>import android.os.Bundle
  import android.view.LayoutInflater
  import android.view.View
  import android.view.ViewGroup
  import androidx.fragment.app.Fragment
  import com.google.android.gms.maps.CameraUpdate
  import com.google.android.gms.maps.CameraUpdateFactory
  import com.google.android.gms.maps.GoogleMap
  import com.google.android.gms.maps.SupportMapFragment
  import com.google.android.gms.maps.model.LatLng
  
  
  
  class MapViewFragment : Fragment() {
  
      private lateinit var mMap: GoogleMap
      private var userLatitude     = 38.2500486
      private var userLongitude    = -85.7647484
      private lateinit var mapFragment : SupportMapFragment
  
      private var binding : MapViewFragmentBinding ?=null
  
      private fun zoomingLocation(): CameraUpdate {
          return CameraUpdateFactory.newLatLngZoom(LatLng(userLatitude, userLongitude), 14f)
      }
  
      private fun configActivityMaps(googleMap: GoogleMap): GoogleMap {
          // set map type
          googleMap.mapType = GoogleMap.MAP_TYPE_NORMAL
          // Enable / Disable zooming controls
          googleMap.uiSettings.isZoomControlsEnabled = false
  
          // Enable / Disable Compass icon
          googleMap.uiSettings.isCompassEnabled = true
          // Enable / Disable Rotate gesture
          googleMap.uiSettings.isRotateGesturesEnabled = true
          // Enable / Disable zooming functionality
          googleMap.uiSettings.isZoomGesturesEnabled = true
  
          googleMap.uiSettings.isScrollGesturesEnabled = true
          googleMap.uiSettings.isMapToolbarEnabled = true
  
          return googleMap
      }
  
      
      override fun onCreateView(
              inflater: LayoutInflater,
              container: ViewGroup?,
              savedInstanceState: Bundle?
      ): View {
          binding = MapViewFragmentBinding.inflate(inflater)
  
          mapFragment = (childFragmentManager.findFragmentById(R.map.id) as SupportMapFragment?)!!
          mapFragment.getMapAsync { googleMap -&gt;
              mMap = configActivityMaps(googleMap)
              mMap.moveCamera(zoomingLocation())
          }
  
          return binding!!.root
      }
  
      override fun onDestroyView() {
          super.onDestroyView()
          
          mapFragment =null
          binding=null
      }
  }
  </code></pre>
  <p>....................</p>
  <ul>
  <li><p>Build.VERSION.SDK_INT: 25</p>
  </li>
  <li><p>Build.MANUFACTURER: samsung</p>
  </li>
  <li><p>LeakCanary version: 2.7</p>
  </li>
  <li><p>Stats: LruCache[maxSize=3000,hits=5750,misses=80700,hitRate=6%]
  RandomAccess[bytes=4089892,reads=80700,travel=60892211355,range=18101017,size=22
  288421]</p>
  </li>
  <li><p>Heap dump reason: user request</p>
  </li>
  <li><p>Analysis duration: 29922 ms</p>
  </li>
  </ul>
  <p><em><strong>Tried: Same issue</strong></em></p>
  <pre><code>import androidx.fragment.app.Fragment
  import android.os.Bundle
  import android.view.LayoutInflater
  import android.view.View
  import android.view.ViewGroup
  import com.google.android.gms.maps.CameraUpdateFactory
  import com.google.android.gms.maps.OnMapReadyCallback
  import com.google.android.gms.maps.SupportMapFragment
  import com.google.android.gms.maps.model.LatLng
  import com.google.android.gms.maps.model.MarkerOptions
  
  class MapsFragment : Fragment() {
  
      private val callback = OnMapReadyCallback { googleMap -&gt;
          val sydney = LatLng(-34.0, 151.0)
          googleMap.addMarker(MarkerOptions().position(sydney).title(&quot;Marker in Sydney&quot;))
          googleMap.moveCamera(CameraUpdateFactory.newLatLng(sydney))
      }
  
      override fun onCreateView(inflater: LayoutInflater,
                                container: ViewGroup?,
                                savedInstanceState: Bundle?): View? {
          return inflater.inflate(R.layout.fragment_maps, container, false)
      }
  
      override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
          super.onViewCreated(view, savedInstanceState)
          val mapFragment = childFragmentManager.findFragmentById(R.id.map) as SupportMapFragment?
          mapFragment?.getMapAsync(callback)
      }
  }
  
  &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
  &lt;fragment xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
      xmlns:tools=&quot;http://schemas.android.com/tools&quot;
      android:id=&quot;@+id/map&quot;
      android:name=&quot;com.google.android.gms.maps.SupportMapFragment&quot;
      android:layout_width=&quot;match_parent&quot;
      android:layout_height=&quot;match_parent&quot;
      tools:context=&quot;.ui.pref.MapsFragment&quot; /&gt;
  </code></pre>