2012-11-12 10 views
35

Gdybym użyć tagu merge jako znacznika macierzystego dla układu mojego fragment, w biegnę na dwie kwestie:Czy możesz użyć znacznika scalania z fragmentami?

  • pierwsze, onCreateView(), jeśli nie określić dołączyć do korzeni, to pojawia się błąd:

    android.view.InflateException: <merge /> can be used only with a valid ViewGroup root and attachToRoot=true

  • i gdybym przywiązują do korzenia, pojawia się błąd:

    java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

Znalazłem fajną odpowiedź na inne pytanie, stwierdzając, że biblioteka fragmentów automatycznie dołącza dziecko do grupy widoku nadrzędnego, którą określisz w zamian. Sugerowałeś, że musisz ustawić attachToRoot na false. W przypadku tagu merge jest to wymagane.

Czy można obejść jedną z tych reguł, aby użyć znacznika merge do układu fragmentu?

Odpowiedz

39

Is it possible to get around either of these rules to use the merge tag for a fragment's layout?

No. Jak już zauważyliśmy, kiedy nadmuchać plik układu, który ma znacznik merge jako nasady ty musi dołączyć go do ważnego rodzica ViewGroup. Dołączenie go do kontenera w onCreateView jest niepoprawne, ponieważ zwracany przez tę metodę View zostanie dodany przez strukturę.

Mogłeś zawsze wystarczy utworzyć układ otoki w metodzie onCreateView do którego można zamocować zawyżone układ (i powrót ten układ otoki), ale uczyni to optymalizacja merge tag bezużyteczny jak można dodać układ otoki w xml plik układ od początku:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    LinearLayout wrapper = new LinearLayout(getActivity()); // for example 
    inflater.inflate(R.layout.layout_with_merge_as_root, wrapper, true); 
    return wrapper; 
} 
+1

tak więc 'android.view.InflateException: może być używany tylko z ważnego pierwiastka ViewGroup i attachToRoot = TRUE to z powodu' attachToRoot = FALSE (korzeń ViewGroup jest ważna) ? –

+0

@Mr_and_Mrs_D Tak, ponieważ dla 'false' zawyżony układ nie zostanie dodany do' ViewGroup' i właśnie to wymaga tag 'merge'. Ponadto, myślę, że ten sam wyjątek zostanie zgłoszony, jeśli użyjesz 'true' dla' attachToRoot', ale z 'null'' ViewGroup' dla drugiego parametru (oznaczającego brak rodzica, do którego należy dołączyć zawyżony układ). – Luksprog

+0

Dzięki - jak denerwujące - ten sam komunikat o błędzie dla 2 sytuacji. Odnośnie 'scalania' i' fragmentów' możesz znaleźć [to] (http://stackoverflow.com/a/15315289/281545) interesujące –

Powiązane problemy