Hirdetés

Új hozzászólás Aktív témák

  • thon73
    tag

    Ma hajnali ötig szívtam a support lib miatt. A support Fragmenteket mindenki ismeri. Viszont kiderült a Googlenek egy turpissága, ami teljesen dokumentálatlanul történik support Fragmentek esetében.

    Fragment hozzáadása alatt ez történik:

    f.mView = f.onCreateView(f.getLayoutInflater(f.mSavedFragmentState),
    null, f.mSavedFragmentState);
    if (f.mView != null) {
    f.mInnerView = f.mView;
    f.mView = NoSaveStateFrameLayout.wrap(f.mView);
    if (f.mHidden) f.mView.setVisibility(View.GONE);
    f.onViewCreated(f.mView, f.mSavedFragmentState);
    } else {
    f.mInnerView = null;
    }

    A NoSaveStateFrameLayout pedig ez:

    class NoSaveStateFrameLayout extends FrameLayout {
    static ViewGroup wrap(View child) {
    NoSaveStateFrameLayout wrapper = new NoSaveStateFrameLayout(child.getContext());
    ViewGroup.LayoutParams childParams = child.getLayoutParams();
    if (childParams != null) {
    wrapper.setLayoutParams(childParams);
    }
    NoSaveStateFrameLayout.LayoutParams lp = new NoSaveStateFrameLayout.LayoutParams(
    ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT);
    child.setLayoutParams(lp);
    wrapper.addView(child);
    return wrapper;
    }
    ...
    }

    Amint fent látható a Google azt a turpisságot követi el, hogy miután az onCreateView lefut, a Fragmentet egy új FrameLayout-ba wrappeli szépen... Ez a FrameLayout pedig jól szétcseszi a View hiearcihámat, különösen nested Fragmentek esetén. Egyébként csomó idő is volt rájönni erre... Az is totál inkorrekt, hogy elvileg az onViewCreated első paraméterének az a specifikációja, hogy az a View, amit az onCreateView csinált - na itt ez se fog érvényesülni, hiszen a wrapper FrameLayout lesz az onViewCreated első paramétere.

    Remélem időt spóroltam Nektek ezzel, hátha Ti is belefuttok ilyesmibe.

    Csak együttérezni tudok. :K
    A Support Fragmenttel én is tapasztaltam anomáliákat 2.3.x és 4-x alatt nem egyformán működött. A másik falba ütközésem a nested megvalósítással történt, így utólag valószínű pont emiatt. (Nem megfelelően állt fel a layout, különösen újraindításnál.) Én feladtam a nested variánst, azóta mindent szigorúan az Activity vezérel (szinte csak erre tartom :) )
    De elismerésem, hogy ezt így kibogoztad!!! :C

Új hozzászólás Aktív témák