2012-11-12 9 views
35

Se uso il tag merge come il tag principale per il layout del mio frammento, mi imbatto in due problemi:È possibile utilizzare il tag di unione con i frammenti?

  • prima, in onCreateView(), se mi specificare di non allegare alla radice, ottengo l'errore:

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

  • e se io attribuisco alla radice, ottengo l'errore:

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

Ho trovato una bella risposta a un'altra domanda qui dicendo che la libreria dei frammenti collegherà automaticamente il bambino al gruppo di visualizzazione padre specificato in sostituzione. Il suggerimento era che era necessario impostare attachToRoot su false. Per il tag merge, è obbligatorio.

È possibile aggirare una di queste regole per utilizzare il tag merge per il layout di un frammento?

risposta

39

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

No. Come già visto, quando si gonfia un file di layout che ha il tag merge come radice si necessario allegarlo a un genitore valida ViewGroup. Il collegamento al contenitore nel numero onCreateView non è corretto poiché il View restituito da tale metodo verrà aggiunto dal framework.

Si può sempre e solo creare un layout involucro nel metodo onCreateView a cui allegare il layout gonfiato (e restituire questo layout involucro), ma questo renderà l'ottimizzazione merge tag inutile come si potrebbe aggiungere il layout involucro in xml file di layout fin dall'inizio:

@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

Così il 'android.view.InflateException: può essere utilizzato solo con una radice ViewGroup valido e attachToRoot = true' è a causa del' attachToRoot = false' (la radice ViewGroup è valido) ? –

+0

@Mr_and_Mrs_D Sì, perché per 'false' il layout gonfiato non verrà aggiunto al' ViewGroup' e questo è esattamente ciò che richiede il tag 'merge'. Inoltre, penso che verrà lanciata la stessa eccezione se si usa 'true' per' attachToRoot' ma con 'View' Null' per il secondo parametro (che significa nessun genitore a cui allegare il layout gonfiato). – Luksprog

+0

Grazie - quanto fastidioso - lo stesso messaggio di errore per 2 situazioni. Per quanto riguarda 'unisci' e' frammenti' potresti trovare [questo] (http://stackoverflow.com/a/15315289/281545) di interesse –

Problemi correlati