Come get RelativeLayout a lavorare con merge e includere?

Ho cercato per alcuni giorni di rendere i miei layout più efficienti convertendo dall'utilizzo di diversi livelli di LinearLayouts nidificati in un RelativeLayout e sono venuti in qualche problema che non sono riuscito a trovare una soluzione per …

Ho cercato il gruppo di principianti Android e questo sito e non sono stati in grado di trovare qualsiasi cosa che mi aiuti a risolvere il problema.

  • perché il mio schermo splash non mostra le immagini?
  • Come modificare il nome del progetto in Android Studio
  • Barra di azione Android Split con elementi di azione in alto e in basso?
  • MediaRecorder.stop () appeso con Android 4.0 (ICS)
  • Attività per l'attività Android / responsabilità di frammentazione per il caricamento dei dati
  • Tipo di carattere personalizzato nel titolo della scheda ActionBar
  • Ho letto su uno dei blog che puoi combinare i layout con unire e includere tag. Quindi quello che ho è un file di layout principale con un elemento radice RelativeLayout . All'interno di questo ho 5 include tag che riferiscono 5 diversi file di layout xml che ognuno ha un elemento di unione per la radice (tutti i miei file di unione sono gli stessi tranne gli ids in essi).

    Mi trovo in due problemi, che spiegherò dopo aver postato una versione semplificata del mio codice di layout:

    File di layout principale di esempio:

     <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/translucent_gray" > <include android:id="@+id/running_gallery_layout_id" layout="@layout/running_gallery_layout" /> <include android:id="@+id/recent_gallery_layout_id" layout="@layout/recent_gallery_layout" android:layout_below="@id/running_gallery_layout_id" /> <include android:id="@+id/service_gallery_layout_id" layout="@layout/service_gallery_layout" android:layout_below="@id/recent_gallery_layout_id" /> <include android:id="@+id/process_gallery_layout_id" layout="@layout/process_gallery_layout" android:layout_below="@id/service_gallery_layout_id" /> </RelativeLayout> 

    Esempio incluso file di merge:

     <?xml version="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android"> <TextView style="@style/TitleText" android:id="@+id/service_gallery_title_text_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="left" android:text="@string/service_title" /> <Gallery android:id="@+id/service_gallery_id" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:layout_below="@id/service_gallery_title_text_id" /> <TextView style="@style/SubTitleText" android:id="@+id/service_gallery_current_text_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/service_gallery_title_text_id" android:layout_above="@id/service_gallery_id" /> </merge> 

    Sono in corso due problemi:

    1) Gli attributi android:layout_* sembrano essere ignorati quando utilizzati nel tag include e tutti i layout uniti vengono visualizzati in cima all'altro. Secondo questo post ( http://developer.android.com/resources/articles/layout-tricks-reuse.html ) "qualsiasi attributo android:layout_* può essere utilizzato con il <include /> "

    2) Poiché non ho potuto get questo lavoro ho deciso di provare ad aggiungere un android:layout_below attributo al primo elemento di TextView in each file di layout di unione, il che significa che each file di unione si android:layout_below ad un id di un altro file di unione di configuration … Per la maggior parte questo funzionava effettivamente e il mio layout sembra benissimo. Tuttavia, ottengo un errore su uno degli android:layout_below attributi dicendo che non riesce a trovare l'id che ho specificato … ho duplice e tripla controllai gli ids per assicurarsi che fossero corretti. La parte più strana è che ho usato la function AutoFill per mettere l'id nell'attributo in primo luogo.

    Se qualcuno ha suggerimenti o soluzioni alternative, sarò più che felice di provarli. Inoltre, se qualcuno può pensare a un modo per me di avere un solo file di layout xml unire invece di 5 che sarebbe molto apprezzato. Non ho trovato un modo per farlo perché devo avere accesso a ciascun elemento nei file di layout di unione in fase di runtime …

  • Chiarimento di accesso di Twitter
  • caricare pdf in webview mentre offline
  • Come aggiungere -Xlint: non controllato al mio progetto basato su Gradley di Android?
  • Come modificare l'icona della barra d'azione quando viene cliccato
  • Qual è la causa legale di Oracle contro Google per gli sviluppatori Android?
  • Metodo findViewById android
  • 6 Solutions collect form web for “Come get RelativeLayout a lavorare con merge e includere?”

    Esiste un problema con il tag include. Verifica: https://issuetracker.google.com/issues/36908001

    Per risolvere il problema, assicurarsi di sovrascrivere il layout_width e layout_height quando includere, altrimenti tutto verrà ignorato.

    Vedere la risposta più altamente votata qui sotto. La mia è terribilmente obsoleta


    posso affrontare un problema Justin ha sollevato: l'incapacità di RelativeLayout di gestire il posizionamento di un include (alless in questo caso semplice, su un emulatore 1.6)

    CommonsWare suggerisce di avvolgere le inclusioni in un contenitore padre unico, ma lo fa per aiutare l'indirizzamento e scoping identicamente denominati Views all'interno di Justin's include

    Ciascuno dovrebbe avere un contenitore genitore unico e chiamerebbe findViewById () su quel contenitore (ViewGroup) anziché sull'attività.

    Infatti, devi anche farlo per get il comportmento di RelativeLayout come previsto:

    Questo funziona (il piè di pagina è ben posizionato):

     <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <include android:id="@+id/header" layout="@layout/header" android:layout_alignParentTop="true" /> <WebView android:id="@+id/webView" android:layout_below="@id/header" android:background="#77CC0000" android:layout_height="wrap_content" android:layout_width="fill_parent" android:focusable="false" /> <LinearLayout android:layout_alignParentBottom="true" android:layout_height="wrap_content" android:layout_width="fill_parent"> <include android:id="@+id/footer" layout="@layout/footer" /> </LinearLayout> </RelativeLayout> 

    Questo non (il piè di pagina galleggia in cima allo schermo):

     <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <include android:id="@+id/header" layout="@layout/header" android:layout_alignParentTop="true" /> <WebView android:id="@+id/webView" android:layout_below="@id/header" android:background="#77CC0000" android:layout_height="wrap_content" android:layout_width="fill_parent" android:focusable="false" /> <include android:id="@+id/footer" layout="@layout/footer" android:layout_alignParentBottom="true" /> </RelativeLayout> 

    Il piede inferiore include include non allineare al fondo del genitore, senza il circostante LinearLayout. Non definirei questo comportmento previsto.

    Inoltre, il WebView sembra attaccarsi bene all'intestazione per ID, ma credo che questo sia illusione, perché semplicemente scorre sotto l'intestazione verticalmente. Ho anche cercato di impostare un button proprio sopra il piè di pagina incluso, ma ha ottenuto tutto floaty e sbagliato, anche

    RelativeLayout ha avuto più problemi in 1,5, ma mi piace ancora 🙂

    Uomo, questo è vecchio, ma sembra venire in cima alle ricerche, quindi commenterò.

    Penso che il trucco qui è che il tag <merge> combinato con il tag <include> rimuove essenzialmente qualsiasi tipo di gruppo di "parent" view a quel livello. Allora, chi stai chiedendo di "layout_below" qualcun altro? Nessuno. Non esiste una vista a questo livello.

    Il tag <merge> prende le viste del figlio e le pone direttamente nel genitore del tag <include> . Dovete pertanto chiedere ai bambini nel layout che stai includendo per ancorarsi di conseguenza.

    Per il posizionamento per lavorare su RelativeLayout è necessario impostare i parametri layout_ * nel file di inclusione, non nel file di layout principale. Quel modo

    main_layout.xml

     <RelativeLayout android:id="@+id/header" android:layout_width="fill_parent" android:layout_height="wrap_content"> .... </RelativeLayout> <RelativeLayout android:id="@+id/footer" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true"> ..... </RelativeLayout> <include layout="@layout/content_layout" /> 

    content_layout.xml

     <merge xmlns:android="http://schemas.android.com/apk/res/android"> <RelativeLayout android:id="@+id/content" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_above="@id/footer" android:layout_below="@id/header" > .... </RelativeLayout> </merge> 

    Questo non è ovviamente quello che vogliamo gli sviluppatori, ma è l'unica soluzione che ho trovato per evitare di duplicare xml

    Gli attributi di android: layout_ * sembrano essere ignorati quando utilizzati nel tag include e tutti i layout uniti vengono visualizzati in cima all'altro.

    La mia ipotesi è che non puoi fare riferimento, dalle regole di layout, agli attributi android:id che sono definiti su elementi <include> , solo quelli che sono su widget e contenitori "reali".

    Inoltre, se qualcuno può pensare a un modo per me di avere un solo file di layout xml unire invece di 5 che sarebbe molto apprezzato.

    Semplice: metterli tutti in un file.

    Non riuscivo a trovare un modo per farlo perché devo avere accesso a ciascun elemento nei file di layout di unione in fase di runtime

    Se si dispone di un elemento <include> o 1.000, tutti i contenuti devono essere accessibili in fase di runtime. Un'exception è se hai duplicato gli attributi android:id – dovresti findViewById() correttamente le chiamate findViewById() per get il giusto, proprio come dovrai quando ottieni i widget da una row di ListView.

    Se puoi creare un progetto di esempio che utilizza i file di fusione di 2+ in cui puoi dimostrare che i contenuti non sono accessibili in fase di runtime, fathemes sapere.

    Nel mio caso, il layout che stavo cercando di includere inizia con il tag <merge . Quando l'ho cambiato in un layout, dire che <RelativeLayout funziona. Sotto è l'illustrazione.

    LAVORO

     <RelativeLayout xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android" tools:showIn="@layout/activity_home"> 

    NON FUNZIONA

     <merge xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android" tools:showIn="@layout/activity_home"> 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.