Visualizzazioni di layout alternative

In questo argomento viene illustrato come è possibile usare i layout delle versioni usando i qualificatori di risorse. Ad esempio, la creazione di una versione di un layout usata solo quando il dispositivo è in modalità orizzontale e una versione di layout solo per la modalità verticale.

Creazione di layout alternativi

Quando si fa clic sull'icona Visualizzazione layout alternativo (a sinistra del dispositivo), viene aperto un riquadro di anteprima per elencare i layout alternativi disponibili nel progetto. Se non sono presenti layout alternativi, viene visualizzata la visualizzazione Predefinita :

Alternate layout view pane

Quando si fa clic sul segno più verde accanto a Nuova versione, viene visualizzata la finestra di dialogo Crea variante layout in modo da poter selezionare i qualificatori di risorse per questa variante di layout:

Create layout variation

Nell'esempio seguente il qualificatore di risorsa per l'orientamento dello schermo è impostato su Orizzontale e la dimensione dello schermo viene modificata in Grande. Verrà creata una nuova versione del layout denominata large-land:

Large-land variation

Si noti che il riquadro di anteprima a sinistra visualizza gli effetti delle selezioni del qualificatore di risorsa. Facendo clic su Aggiungi viene creato il layout alternativo e viene visualizzata la finestra di progettazione. Il riquadro di anteprima Visualizzazione layout alternativo indica il layout caricato nella finestra di progettazione tramite un piccolo puntatore destro, come indicato nello screenshot seguente:

Loaded layout indicator

Modifica di layout alternativi

Quando si creano layout alternativi, è spesso consigliabile apportare una singola modifica applicabile a tutte le versioni con fork di un layout. Ad esempio, è possibile modificare il testo del pulsante in giallo in tutti i layout. Se si dispone di un numero elevato di layout ed è necessario propagare una singola modifica a tutte le versioni, la manutenzione può diventare rapidamente complessa e soggetta a errori.

Per semplificare la manutenzione di più versioni di layout, progettazione offre una modalità di modifica multipla che propaga le modifiche in uno o più layout. Quando sono presenti più layout, viene visualizzata l'icona Modifica multipla:

Multi-edit icon

Quando si fa clic sull'icona a modifica multipla, le righe vengono visualizzate che indicano che i layout sono collegati (come illustrato di seguito), ovvero quando si apporta una modifica a un layout, tale modifica viene propagata a qualsiasi layout collegato. È possibile scollegare tutti i layout facendo clic sull'icona cerchiata indicata nello screenshot seguente:

Unlink all layouts

Se sono presenti più di due layout, è possibile attivare o disattivare in modo selettivo il pulsante di modifica a sinistra di ogni anteprima del layout per determinare quali layout sono collegati tra loro. Ad esempio, se si vuole apportare una singola modifica che si propaga al primo e all'ultimo di tre layout, scollegare prima il layout centrale, come illustrato di seguito:

Unlink middle layout

In questo esempio, una modifica apportata al layout predefinito o lungo verrà propagata all'altro layout, ma non al layout di terra di grandi dimensioni .

Esempio di modifica multipla

In generale, quando si apporta una modifica a un layout, la stessa modifica viene propagata a tutti gli altri layout collegati. Ad esempio, l'aggiunta di un nuovo TextView widget al layout predefinito e la modifica della stringa di testo in Portrait causerà la stessa modifica a tutti i layout collegati. Ecco come appare nel layout predefinito :

Add TextView

Viene TextView aggiunto anche alla visualizzazione layout terra di grandi dimensioni perché è collegato al layout predefinito :

Landscape TextView

Ma cosa accade se si vuole apportare una modifica locale a un solo layout, ovvero non si vuole che la modifica venga propagata ad altri layout? A tale scopo, è necessario scollegare il layout che si desidera modificare prima di modificarlo, come illustrato di seguito.

Apportare modifiche locali

Si supponga che entrambi i layout abbiano aggiunto TextView, ma si vuole anche modificare la stringa di testo nel layout di terra grande in Landscape anziché Portraitsu . Se si apporta questa modifica a un terreno di grandi dimensioni mentre entrambi i layout sono collegati, la modifica verrà propagata nuovamente al layout predefinito . Pertanto, prima di apportare la modifica, è necessario scollegare i due layout. Quando si modifica il testo in grandi terreniLandscape in , la finestra di progettazione contrassegna questa modifica con una cornice rossa per indicare che la modifica è locale nel layout di grandi dimensioni e non viene propagata di nuovo al layout predefinito:

Local change

Quando si fa clic sul layout predefinito per visualizzarlo, la TextView stringa di testo è ancora impostata su Portrait.

Gestione dei conflitti

Se si decide di modificare il colore del testo nel layout predefinito in verde, verrà visualizzata un'icona di avviso nel layout collegato. Facendo clic su tale layout viene aperto il layout per visualizzare il conflitto. Il widget che ha causato il conflitto viene evidenziato con una cornice rossa e viene visualizzato il messaggio seguente: Le modifiche recenti hanno causato conflitti in questo layout alternativo.

Conflicting change

Una casella di conflitto viene visualizzata a destra del widget per spiegare il conflitto:

Conflict warning

La casella dei conflitti mostra l'elenco delle proprietà che sono state modificate ed elenca i relativi valori. Facendo clic su Ignora conflitto la proprietà viene applicata solo a questo widget. Facendo clic su Applica si applica la modifica della proprietà a questo widget e al widget controparte nel layout predefinito collegato. Se vengono applicate tutte le modifiche alle proprietà, il conflitto viene eliminato automaticamente.

Visualizzare i conflitti di gruppo

Le modifiche alle proprietà non sono l'unica origine di conflitti. È possibile rilevare conflitti durante l'inserimento o la rimozione di widget. Ad esempio, quando il layout di terra grande è scollegato dal layout predefinito e nel TextViewlayout di terra grande viene trascinato e rilasciato sopra Button, la finestra di progettazione contrassegna il widget spostato per indicare il conflitto:

View group conflict

Tuttavia, non è presente alcun marcatore nell'oggetto Button. Anche se la posizione di è cambiata, l'oggetto ButtonButton non mostra modifiche applicate specifiche della configurazione di terra di grandi dimensioni .

CheckBox Se un oggetto viene aggiunto al layout predefinito, viene generato un altro conflitto e viene visualizzata un'icona di avviso sul layout di grandi dimensioni:

Checkbox conflict

Facendo clic sul layout di terra di grandi dimensioni viene visualizzato il conflitto. Viene visualizzato il messaggio seguente: Le modifiche recenti hanno causato conflitti in questo layout alternativo:

Alt layout conflict

Inoltre, nella casella dei conflitti viene visualizzato il messaggio seguente:

Conflict message

L'aggiunta CheckBox di causa un conflitto perché il layout di terra di grandi dimensioni ha modifiche nell'oggetto LinearLayout che lo contiene. Tuttavia, in questo caso la casella dei conflitti visualizza il widget appena inserito nel layout predefinito (il ).CheckBox

Se si fa clic su Ignora conflitto, progettazione risolve il conflitto, consentendo al widget visualizzato nella casella di conflitto di essere trascinato e rilasciato nel layout in cui manca il widget (in questo caso, il layout di terra grande ):

Resolved group conflict

Come illustrato nell'esempio precedente con , l'oggetto ButtonCheckBox non dispone di un indicatore di modifica rosso perché solo le LinearLayout modifiche applicate nel layout di terra di grandi dimensioni.

Persistenza dei conflitti

I conflitti vengono mantenuti nel file di layout come commenti XML, come illustrato di seguito:

<!-- Widget Inserted Conflict | id:__root__ | @+id/checkBox1 -->

Pertanto, quando un progetto viene chiuso e riaperto, tutti i conflitti saranno ancora presenti, anche quelli che sono stati ignorati.