Autore Topic: Come creare oggetti xml dalla parte del codice  (Letto 352 volte)

Offline lucabasket08

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S4 mini
  • Sistema operativo:
    Windows 10
Come creare oggetti xml dalla parte del codice
« il: 06 Giugno 2016, 23:40:49 CEST »
0
Salve a tutti. Ho iniziato qualche giorno fa ad approcciarmi ad Android Studio per cercare di sviluppare qualche app. Però sto incontrando qualche difficoltà

La mia domanda è:
Se io volessi per esempio creare un oggetto qualsiasi da mettere nella schermata (un bottone, una scritta, ecc..) tramite un bottone (quindi dal mainActivity) come posso fare?

Ho provato a creare l'oggetto in questo modo Button button = new Button() però non so come inserirlo nell'xml o perlomeno all'interno di un layout creato in precedenza.
Ho provato a prendere il Layout tramite id, ma non compare quando vado a fare RelativeLayout layout = (RelativeLayout) findViewById(R.id."Id del layout").
Qualcuno sa come fare? Grazie in anticipo

Offline capitancooker

  • Utente junior
  • **
  • Post: 56
  • Marco
  • Respect: +3
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5, Asus Zenpad S 8.0
  • Sistema operativo:
    Mac OSX El Capitan
Re:Come creare oggetti xml dalla parte del codice
« Risposta #1 il: 07 Giugno 2016, 04:47:33 CEST »
0
Per aggiungere ad un layout il nuovo oggetto usa il metodo addView. Es: layout_principale.addView(view_da_aggiungere).
Se sbaglio, correggetemi.

Offline lucabasket08

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S4 mini
  • Sistema operativo:
    Windows 10
Re:Come creare oggetti xml dalla parte del codice
« Risposta #2 il: 07 Giugno 2016, 11:27:25 CEST »
0
si, ma non so come prendere il layout dal file xml

Offline capitancooker

  • Utente junior
  • **
  • Post: 56
  • Marco
  • Respect: +3
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5, Asus Zenpad S 8.0
  • Sistema operativo:
    Mac OSX El Capitan
Re:Come creare oggetti xml dalla parte del codice
« Risposta #3 il: 07 Giugno 2016, 11:33:22 CEST »
0
Devi usare l'Inflater. Ho trovato questo esempio in rete:
Codice (Java): [Seleziona]
RelativeLayout item = (RelativeLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, null);
item.addView(child);

Stai attento alle impostazioni di layout (margini e altre voci) perché a me con questo metodo li perde, magari è un mio errore.
Io risolvo aggiungendoli con la classe LayoutParams.

Ciao,
Marco
Se sbaglio, correggetemi.

Offline lucabasket08

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S4 mini
  • Sistema operativo:
    Windows 10
Re:Come creare oggetti xml dalla parte del codice
« Risposta #4 il: 07 Giugno 2016, 12:11:45 CEST »
0
Il punto è che il layout di default non ha un id e anche se lo aggiungo io non lo mosta quando vado a richiamarlo con R.id.

Offline capitancooker

  • Utente junior
  • **
  • Post: 56
  • Marco
  • Respect: +3
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5, Asus Zenpad S 8.0
  • Sistema operativo:
    Mac OSX El Capitan
Re:Come creare oggetti xml dalla parte del codice
« Risposta #5 il: 07 Giugno 2016, 12:16:29 CEST »
0
Io valorizzo i "child" con setTag e li richiamo con findViewWithTag.
Credo comunque che l'ID debba essere valorizzato e non uguale ad altre view inserite in precedenza, ci ho perso un po' la testa giorni fa.
Ciao,
Marco
Se sbaglio, correggetemi.

Offline lucabasket08

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S4 mini
  • Sistema operativo:
    Windows 10
Re:Come creare oggetti xml dalla parte del codice
« Risposta #6 il: 07 Giugno 2016, 12:33:56 CEST »
0
Per il layout non mi fa usare findViewWithTag.

RelativeLayout item = (RelativeLayout) findViewById(R.id.??)

al posto dei punti interrogativi non compare l'id. Scusami ma non riesco a capire come fare

Offline capitancooker

  • Utente junior
  • **
  • Post: 56
  • Marco
  • Respect: +3
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5, Asus Zenpad S 8.0
  • Sistema operativo:
    Mac OSX El Capitan
Re:Come creare oggetti xml dalla parte del codice
« Risposta #7 il: 07 Giugno 2016, 12:51:29 CEST »
0
Il layout principale deve avere un id, altrimenti non puoi richiamarlo per introdurre le view che ti servono.
Provo a darti un esempio, scrivo a memoria e spero di non aver dimenticato nulla:
Codice (Java): [Seleziona]
// il file xml dell'activity
setContentView(R.layout.activity_main);

// valorizzo il layout dove introdurre le singole view, io preferisco la Linear per evitarmi problemi di allineamento
LinearLayout layout = (LinearLayout) view.findViewById(R.id.layout_vuoto);

// creo una TextView da file XML
TextView tv = (TextView) getLayoutInflater().inflate(R.layout.text_view_senza_id, null, false);
tv.setId(id_univoco);
tv.setTag(tag_univoco);

// lo aggiungo al LinearLayout
layout.addView(tv);

Io per recuperare la TextView la cerco con il tag sempre nel layout
Codice (Java): [Seleziona]
TextView tv = layout.findViewWithTag(tag_univoco)
Se non ho inteso la tua esigenza, se puoi, posta il codice così cerco di capire.

Ciao,
Marco
Se sbaglio, correggetemi.

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 580
  • Respect: +130
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 7 x64
Re:Come creare oggetti xml dalla parte del codice
« Risposta #8 il: 07 Giugno 2016, 13:07:36 CEST »
0

Come regola generale di design, se si arriva al punto di dover assegnare un ID ad una View, probabilmente si sta sbagliando qualcosa.

Invece di assegnare un ID suggerisco caldamente di mantenere un riferimento alla vista creata e poi utilizzare quello per accedere alle sue proprietà, se necessario.


Codice (Java): [Seleziona]
public class MiaActivity extends Activity {

  TextView nuovaTv; //Campo di MiaActivity

  //...
  protected void onCreate(Bundle savedInstanceState) {

    //...

    nuovaTv = (TextView) getLayoutInflater().inflate(R.layout.text_view_senza_id, null, false);

    //...

  }
 
  protected void MioMetodo() {

    //Invece di TextView tv = layout.findViewWithTag(tag_univoco) basta fare
    TextView tv = nuovaTv;

  }

}
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 lucabasket08

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S4 mini
  • Sistema operativo:
    Windows 10
Re:Come creare oggetti xml dalla parte del codice
« Risposta #9 il: 07 Giugno 2016, 13:32:01 CEST »
0
questo è il file xml

[size=9,0pt]<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/idACaso"
tools:context="com.lucafalasca.prova.MainActivity">
</RelativeLayout>[/size][/font]che è vuoto perchè ho creato un progetto a parte per cercare di risolvere questo problema.

[/size][size=9,0pt]public class MainActivity extends AppCompatActivity {

   
@Override
protected void onCreate(Bundle savedInstanceState) {
       
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RelativeLayout item = (RelativeLayout) findViewById(R.id.idACaso);}
}[/size]


Il problema era che io volevo inserire una view (ad esempio una textView)  dal codice java però quando andavo a richiamare il layout con R.id. l'id del layout non compariva e quindi non riuscivo ad inserirgli niente all'interno. Credo che fosse un bug dato che ORA LO TROVA >.>

quindi si, a quanto pare stavo impazzendo su un problema che non esisteva. Grazie comunque di tutto, anche se ancora non capisco come questo bug sia durato due giorni e adesso tutto ad un tratto funzioni