Autore Topic: Layout misto XML e java  (Letto 564 volte)

Offline Sime

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei P8 Lite
  • Sistema operativo:
    Windows 7
Layout misto XML e java
« il: 16 Settembre 2017, 09:39:53 CEST »
0
Nel caso volessi realizzare un layout misto sia con elementi in layout.xml che provenienti dal codice java come mi devo regolare?

Come specifico dove andrà a posizionarsi ad esempio una View se la aggiungo in java; la stessa cosa per un contenitore.

E se volessi soltanto utilizzare Java il file Layout lo devo cancellare?

Offline berpao

  • Utente junior
  • **
  • Post: 116
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Play Store ID:
    Paolo Bersan
Re:Layout misto XML e java
« Risposta #1 il: 18 Settembre 2017, 01:23:04 CEST »
0
Ciao, guardando in giro ho visto che si può creare una activity senza un layout... ma da quello che dici tu secondo me ti conviene avere un layout minimo nel file xml (non so,, un generico Relative layout o quello che ti serve per meglio costruire la tua interfaccia) e poi da li innesti dinamicamente i veri elementi di UI; tieni presente che con java puoi creare e posizionare gli elementi modificando gli stessi attributi che modificheresti nel file xml (magaricon qualche riga di codice in più, ma si può fare)

Ciao
P

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 804
  • Respect: +168
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 10 x64
Re:Layout misto XML e java
« Risposta #2 il: 18 Settembre 2017, 09:38:54 CEST »
0
@Sime: Quello che dice berpao è giusto, ma probabilmente stai sbagliando qualcosa.

Il framework è sviluppato in modo da separare il design delle UI dal codice sottostante, e tranne qualche caso legittimo è sconsigliabile creare le interfacce via codice. E' più complicato, ci vuole più tempo, è meno adattabile a schermi diversi ed il codice è più difficile da mantenere.

Potrei sapere come mai hai bisogno di creare un layout misto?

Poi, per completare la risposta alla tua domanda: solitamente quando si usa un layout misto di aggiungono dinamicamente nuove viste nei contenitori già definiti. Ad esempio in layout.xml definisci un FrameLayout o un LinearLayout e poi aggiungi le tue viste lì dentro.

Esempio: per creare una lista senza usare ListView posso creare un LinearLayout all'interno di una scrollview. Da codice creo i vari elementi e li aggiungo al LinearLayout facendo mLinearLayout.addView(nuovaView).

Nota: anche in questo caso di solito i singoli elementi vengono creati a partire da un altro layout e non da codice. Esempio:

Codice (Java): [Seleziona]
LinearLayout mLinearLayout = (LinearLayout)findViewById(R.id.linearLayout);
LayoutInflater inflater = LayoutInflater.from(this); //this è l'activity
mLinearLayout.removeAllViews(); //Tolgo eventuali view non richieste

//Aggiungo un nuovo elemento alla lista (ripetere questi passi per ogni elemento)
//Parametri usati:
//R.layout.item_layout: Layout dell'elemento della lista
//mLinearLayout: ViewGroup che conterrà l'elemento. Serve per stabilire lo stile da usare
//false: Indico che NON voglio aggiungere automaticamente l'elemento alla lista (lo faremo dopo)
View newView = inflater.inflate(R.layout.item_layout, mLinearLayout, false);

//Aggiunge l'elemento alla lista
mLinearLayout.addView(newView);

In questo caso non devo specificare né posizione né dimensioni perché
- La posizione è stabilita dal contenitore, che metterà i figli in fila
- La dimensione è stabilita sia dal contenitore che dal layout dell'elemento figlio (item_layout.xml in questo caso)
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Sime

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei P8 Lite
  • Sistema operativo:
    Windows 7
Re:Layout misto XML e java
« Risposta #3 il: 18 Settembre 2017, 17:53:50 CEST »
0
Ciao Ohmnibus, penso di aver capito, ho visto qualcosa del genere in giro.

Potresti però spiegarmi perchè hai usato LayoutInflater? E' indispensabile?

Intanto grazie mille sei stato esaustivo.  ;-)

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 804
  • Respect: +168
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 10 x64
Re:Layout misto XML e java
« Risposta #4 il: 19 Settembre 2017, 08:59:44 CEST »
0
Il layoutinflater è necessario se crei una nuova vista a partire da un layout xml. In pratica è un loader che legge l'XML e lo trasforma in oggetti derivati da View (è più complicato di così, ma il concetto è quello). E' utilizzato sotto al cofano quando invochi setContentView per definire il layout dell'activity.

Puoi creare una vista anche da codice, ma è molto più oneroso perché è necessario passare una serie di parametri per definire lo stile, la dimensione, il posizionamento, ecc., quindi ti conviene passare dall'xml anche se devi creare una semplice TextView.
« Ultima modifica: 19 Settembre 2017, 09:01:38 CEST da Ohmnibus »
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline berpao

  • Utente junior
  • **
  • Post: 116
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Play Store ID:
    Paolo Bersan
Re:Layout misto XML e java
« Risposta #5 il: 19 Settembre 2017, 09:16:35 CEST »
0
Ciao,

Citazione
Puoi creare una vista anche da codice, ma è molto più oneroso perché è necessario passare una serie di parametri per definire lo stile, la dimensione, il posizionamento, ecc., quindi ti conviene passare dall'xml anche se devi creare una semplice TextView.

giusto Ohmnibus, ecco un esempio per poter definire posizione e margini in un layout; ogni layout ha un propria classe "<nome_layout>.LayoutParams" che si può usare per definire queste proprietà. Nell'esempio uso la classe LinearLayout.LayoutParams per definire i margini e altri attributi di un linearlayout

Codice (Java): [Seleziona]
            //Istanza classe
            LinearLayout.LayoutParams lay_info_item_cont_pars=new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            //Settaggio margini dove lay_info_view_margin è un integer usato per tutti e 4 i margini
            lay_info_item_cont_pars.setMargins(lay_info_view_margin,lay_info_margin,lay_info_view_margin,lay_info_margin);

            //Creazione di un linearLayout (_activityRef è la current activity)
            LinearLayout lay_info_pkg_number=new LinearLayout(_activityRef);
            //Applicazione parametri al layout
            lay_info_pkg_number.setLayoutParams(lay_info_item_cont_pars);

Ciao
P
« Ultima modifica: 19 Settembre 2017, 09:18:45 CEST da berpao »

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 804
  • Respect: +168
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 10 x64
Re:Layout misto XML e java
« Risposta #6 il: 19 Settembre 2017, 09:43:07 CEST »
0
La stessa cosa esemplificata da @berpao con i layout.xml si fa così:

File item_layout.xml:
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >
</LinearLayout>

Codice (Java): [Seleziona]
LinearLayout lay_info_pkg_number = LayoutInflater.from(this).inflate()(R.layout.item_layout, mLinearLayout, false);
Un appunto per evitare confusione: i parametri di layout devono essere quelli specifici della View contenitore (o "padre").
Per definire dimensione e posizione di un TextView contenuto in un RelativeLayout, va usata la classe RelativeLayout.LayoutParam. Se il TextView è contenuto in un FrameLayout, allora va usata FrameLayout.LayoutParams.
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline berpao

  • Utente junior
  • **
  • Post: 116
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Play Store ID:
    Paolo Bersan
Re:Layout misto XML e java
« Risposta #7 il: 19 Settembre 2017, 10:05:53 CEST »
0
Ciao,

Citazione
Un appunto per evitare confusione: i parametri di layout devono essere quelli specifici della View contenitore (o "padre").

Giustissimo, io stesso ci ho perso diverso tempo quando mi ci sono scontrato, prima di capirlo... questo è un punto importantissimo
P