Hirdetés

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

  • WonderCSabo

    félisten

    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.

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