title: onGetLayoutInflater() cannot be executed until the Fragment is attached to the FragmentManager
body: <p>I sometime get an Exception with the following message:</p>
  
  <blockquote>
    <p>onGetLayoutInflater() cannot be executed until the Fragment is
    attached to the FragmentManager</p>
  </blockquote>
  
  <p>My full stacktrace (which is using <a href="https://github.com/passsy/CompositeAndroid" rel="noreferrer">CompositeAndroid</a> as the parent fragment) :</p>
  
  <pre><code>Fatal Exception: java.lang.IllegalStateException: onGetLayoutInflater() cannot be executed until the Fragment is attached to the FragmentManager.
         at android.support.v4.app.Fragment.getLayoutInflater(Fragment.java:1151)
         at com.pascalwelsch.compositeandroid.fragment.CompositeFragment.super_getLayoutInflater(CompositeFragment.java:1310)
         at com.pascalwelsch.compositeandroid.fragment.FragmentDelegate$7.call(FragmentDelegate.java:204)
         at com.pascalwelsch.compositeandroid.fragment.FragmentDelegate$7.call(FragmentDelegate.java:197)
         at com.pascalwelsch.compositeandroid.fragment.FragmentPlugin.getLayoutInflater(FragmentPlugin.java:149)
         at com.pascalwelsch.compositeandroid.fragment.FragmentPlugin.getLayoutInflater(FragmentPlugin.java:1269)
         at com.pascalwelsch.compositeandroid.fragment.FragmentDelegate$7.call(FragmentDelegate.java:202)
         at com.pascalwelsch.compositeandroid.fragment.FragmentDelegate$7.call(FragmentDelegate.java:197)
         at com.pascalwelsch.compositeandroid.fragment.FragmentDelegate.getLayoutInflater(FragmentDelegate.java:208)
         at com.pascalwelsch.compositeandroid.fragment.CompositeFragment.getLayoutInflater(CompositeFragment.java:163)
         at android.support.v4.app.Fragment.onGetLayoutInflater(Fragment.java:1101)
         at com.pascalwelsch.compositeandroid.fragment.CompositeFragment.super_onGetLayoutInflater(CompositeFragment.java:1710)
         at com.pascalwelsch.compositeandroid.fragment.FragmentDelegate$32.call(FragmentDelegate.java:769)
         at com.pascalwelsch.compositeandroid.fragment.FragmentDelegate$32.call(FragmentDelegate.java:762)
         at com.pascalwelsch.compositeandroid.fragment.FragmentPlugin.onGetLayoutInflater(FragmentPlugin.java:528)
         at com.pascalwelsch.compositeandroid.fragment.FragmentPlugin.onGetLayoutInflater(FragmentPlugin.java:1456)
         at com.pascalwelsch.compositeandroid.fragment.FragmentDelegate$32.call(FragmentDelegate.java:767)
         at com.pascalwelsch.compositeandroid.fragment.FragmentDelegate$32.call(FragmentDelegate.java:762)
         at com.pascalwelsch.compositeandroid.fragment.FragmentDelegate.onGetLayoutInflater(FragmentDelegate.java:773)
         at com.pascalwelsch.compositeandroid.fragment.CompositeFragment.onGetLayoutInflater(CompositeFragment.java:538)
         at android.support.v4.app.Fragment.performGetLayoutInflater(Fragment.java:1132)
         at android.support.v4.app.Fragment.getLayoutInflater(Fragment.java:1117)
         at com.my.app.features.event.EventDetailFragment.attachHeader(EventDetailFragment.java:66)
         ...
  </code></pre>
  
  <p>We can see here that we first call the method <code>getLayoutInflater()</code> at line 1117 and then the one at line 1151.</p>
  
  <p>The first one is this one:</p>
  
  <pre><code>/**
   * Returns the cached LayoutInflater used to inflate Views of this Fragment. If
   * {@link #onGetLayoutInflater(Bundle)} has not been called {@link #onGetLayoutInflater(Bundle)}
   * will be called with a {@code null} argument and that value will be cached.
   * &lt;p&gt;
   * The cached LayoutInflater will be replaced immediately prior to
   * {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)} and cleared immediately after
   * {@link #onDetach()}.
   *
   * @return The LayoutInflater used to inflate Views of this Fragment.
   */
  public final LayoutInflater getLayoutInflater() {
      if (mLayoutInflater == null) {
          return performGetLayoutInflater(null);
      }
      return mLayoutInflater;
  }
  </code></pre>
  
  <p>And the second one is the one that throws the <code>Exception</code> and that is marked as <code>deprecated</code>:</p>
  
  <pre><code>/**
   * Override {@link #onGetLayoutInflater(Bundle)} when you need to change the
   * LayoutInflater or call {@link #getLayoutInflater()} when you want to
   * retrieve the current LayoutInflater.
   *
   * @hide
   * @deprecated Override {@link #onGetLayoutInflater(Bundle)} or call
   * {@link #getLayoutInflater()} instead of this method.
   */
  @Deprecated
  @NonNull
  @RestrictTo(LIBRARY_GROUP)
  public LayoutInflater getLayoutInflater(@Nullable Bundle savedFragmentState) {
      if (mHost == null) {
          throw new IllegalStateException("onGetLayoutInflater() cannot be executed until the "
                  + "Fragment is attached to the FragmentManager.");
      }
      LayoutInflater result = mHost.onGetLayoutInflater();
      getChildFragmentManager(); // Init if needed; use raw implementation below.
      LayoutInflaterCompat.setFactory2(result, mChildFragmentManager.getLayoutInflaterFactory());
      return result;
  }
  </code></pre>
  
  <p>Is it normal that their is a call to a <code>deprecated</code> function here?
  And I think it shouldn't throw the <code>Exception</code> because I'm checking for <code>isAdded()</code> before calling <code>getLayoutInflater()</code>:</p>
  
  <pre><code>private void init () {
      if(isAdded()) {
          attachHeader();
          updateHeader();
      }
  }
  
  private void attachHeader() {
      headerBinding = DataBindingUtil.inflate(getLayoutInflater(), layout.event_detail_header,
              binding.formsContainer, false);
      binding.formsContainer.addView(headerBinding.getRoot(), 0);
  }
  </code></pre>