Autore Topic: Creare View tramite codice java e inserirle in file XML tramite bottone  (Letto 325 volte)

Offline Ezio1400

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 10'
Ciao a tutti!
Ho sempre creato e settato i vari parametri di una generica View tramite file XML ma ora ho bisogno di crearle e settarle tramite codice java.
Vi presento la situazione:
ho creato un file XML e ho già inserito qualche textView ed EditText. Sto usando un RelativeLayout e in esso è presente un bottone che se cliccato crea appunto 2 textView e 2 ediText e setta i vari parametri ,height width e sempre tramite codice java gestisco il posizionamento all'interno del layout tramite il metodo addRule. Fatto ciò provo che tutto funzioni, clicco il bottone e... delle 2 TextView neanche l'ombra mentre i 2 editText compaiono come dei rettangolini neri in una posizione non appropriata. Ora vi posto un pezzo del metodo onCLick del bottone di creazione di una sola TextView:
Codice (Java): [Seleziona]
public void onClick(View v) {
            //creazione textView LINK NAME e settaggio dei parametri
            TextView new_textView_link_name = new TextView(getApplicationContext());
            new_textView_link_name.setId(R.id.textView_link_name_);
            RelativeLayout.LayoutParams params_textView_link_name = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
                    ViewGroup.LayoutParams.WRAP_CONTENT);  //creo parametro con height e weight pari a WRAP_CONTENT
            params_textView_link_name.addRule(RelativeLayout.BELOW, R.id.textView_link_name_0); //posizionamento sotto una TextView pre-esistente
            new_textView_link_name.setLayoutParams(params_textView_link_name);
            new_textView_link_name.setText("Nome link");
            new_textView_link_name.setTextSize(R.dimen.text_size);
            new_textView_link_name.setPadding(R.dimen.text_padding,R.dimen.text_padding,R.dimen.text_padding,R.dimen.text_padding);
            Log.d("IPActiviy","textView link name creata");

           
            //inserimento view nel layout
            final RelativeLayout layout = (RelativeLayout) findViewById(R.id.relativeLayout_IP_Activity);
            layout.addView(new_textView_link_name);

Come vedete ho verificato anche se la textView veniva effettivamente creata. Nel caso abbiate bisogno di più dettagli posso postare immagini del layout prima e dopo il click e più codice.
Ho notato che se creo una semplice TextView (utilizzando nel costruttore il contest this)e la aggiungo al layout all'interno del metodo onCreate mi viene mostrata quando testo l'applicazione. Se però creo la textView all'interno del metodo onCreate e aggiungo la riga di codice
Codice (Java): [Seleziona]
layout.addView(textView) all'interno del metodo onClick del bottone ancora una volta la View non compare.
Grazie per l'aiuto.

Online Ohmnibus

  • Utente senior
  • ****
  • Post: 582
  • 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:Creare View tramite codice java e inserirle in file XML tramite bottone
« Risposta #1 il: 24 Giugno 2016, 00:06:24 CEST »
0
Scusa se lo chiedo, ma perché hai bisogno di creare e settare le View via codice?
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 Ezio1400

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 10'
Re:Creare View tramite codice java e inserirle in file XML tramite bottone
« Risposta #2 il: 24 Giugno 2016, 11:18:58 CEST »
0
Vorrei ricevere una quantità indefinita di informazioni dall'utente tramite editText. Quindi ho pensato che se l'utente vuole inserire ulteriori informazioni basta che clicchi il bottone in modo tale che compaia una nuova EditText.

Online Ohmnibus

  • Utente senior
  • ****
  • Post: 582
  • 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:Creare View tramite codice java e inserirle in file XML tramite bottone
« Risposta #3 il: 24 Giugno 2016, 12:26:49 CEST »
0
Citazione
Quindi ho pensato che se l'utente vuole inserire ulteriori informazioni basta che clicchi il bottone in modo tale che compaia una nuova EditText.

Visto che non si tratta di un caso particolare, ti consiglio di usare il metodo standard usato ampiamente in tutte le principali View (es. ListView).

  • Dove dovranno comparire eventuali view extra, metti un LinearLayut. Assegnagli un id (es. myContainer)
  • Definisci un nuovo layout xml che rappresenta il blocco di viste da aggiungere, nel tuo caso 2 textView e 2 editText (es layout_block.xml)
  • Ottieni un riferimento a myContainer:
    LinearLayout myContainer = (LinearLayout) findViewById(R.id.myContainer);
  • Crea un'istanza ViewGroup che rappresenta il blocco da aggiungere:
    ViewGroup newBlock = (ViewGroup) LayoutInflater.from(this).inflate(R.layout.layout_block, myContainer, false);
  • Aggiungi il nuovo blocco a myContainer:
    myContainer.addView(newBlock);

Se vuoi accedere ai singoli elementi del blocco dovrai tenere un riferimento ad ogni blocco aggiunto, ad esempio:

Codice (Java): [Seleziona]
List<ViewGroup> listaBlocchi = new ArrayList<ViewGroup>().

//...

listaBlocchi.Add(newBlock);

Per accedere agli elementi del blocco farai quindi:

Codice (Java): [Seleziona]
ViewGroup riferimentoBlocco = listaBlocchi[0];
TextView miaTextView = (TextView)riferimentoBlocco.findViewById(R.id.mia_textview);

Usando questa tecnica hai i seguenti vantaggi (solo per citarne alcuni):
  • Meno codice da scrivere
  • Non è necessario gestire gli stili da codice
  • Il codice non cambia se si aggiunge un'altra Vista al singolo blocco
  • Disaccoppiamento tra UI e codice
  • Usando l'editor, hai il preview di come appare un blocco
  • eccetera

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 Ezio1400

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 10'
Re:Creare View tramite codice java e inserirle in file XML tramite bottone
« Risposta #4 il: 24 Giugno 2016, 20:19:45 CEST »
0
Grazie, con molto meno codice son riuscito a realizzare quello che volevo fare.
Posso chiederti un ultimo favore? Riusciresti a spiegarmi esattamente il significato della seguente riga di codice perchè non mi è molto chiara , soprattutto il concetto di LayoutInflare, ho guardato la documentazione ma non mi è comunque ben chiara:

Codice (Java): [Seleziona]
ViewGroup newBlock = (ViewGroup) LayoutInflater.from(this).inflate(R.layout.layout_block, myContainer, false);
Ho notato che se metto come parametro al posto di myContainer null il tutto funziona ugualmente.

Ti ringrazio ancora, l'unica cosa che mi da un po fastidio è che lo "sfondo" delle textView mi compare nero, nonostante nella preview sia bianco, bah proverò a settare qualche parametro.

Online Ohmnibus

  • Utente senior
  • ****
  • Post: 582
  • 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:Creare View tramite codice java e inserirle in file XML tramite bottone
« Risposta #5 il: 24 Giugno 2016, 23:15:44 CEST »
0
Il metodo in soldoni analizza un XML di layout e ne crea una rappresentazione ad oggetti, definendo attributi e dimensioni.

Lo stesso concetto viene usato nella onCreate delle Activity invocando setContentView.

Il LayoutInflater non può essere istanziato, ma deve essere generato a partire da un Context, ecco perché si chiama LayoutInflater.from(this). In alternativa, all'interno di un'Activity, è possibile invocare getLayoutInflater.

Il metodo inflate richiede un "parent" dal quale ereditare attributi, come lo stile. E' possibile specificare null, ma in alcune circostanze i risultati possono essere inattesi.

L'ultimo parametro indica se "appendere" la nuova View appena creata al parent. Solitamente è meglio farlo "a mano" invocando parent.AddView.

Lo sfondo delle TextView ti appare nero probabilmente per colpa di qualche stile strano. Prova a definire come sfondo

Codice (XML): [Seleziona]
android:background="@android:drawable/edit_text"
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 Ezio1400

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 10'
Re:Creare View tramite codice java e inserirle in file XML tramite bottone
« Risposta #6 il: 25 Giugno 2016, 15:39:58 CEST »
0
Si ho provato ad impostare lo sfondo che mi hai suggerito nel file xml però non è proprio uguale a quello di default di un generico editText, nonostante ciò comunque questo sfondo viene propagato anche nelle EditText aggiunte con il bottone che quindi non hanno più lo sfondo nero. Io non capisco perchè se vado ad aggiungere il blocco che ho creato mi cambia lo stile delle View. Metto in allegato il blocco da inserire e uno screenshot con il blocco già presente nel layout(il primo) e la "trasformazione" che il blocco subisce quando lo aggiungo con il buttone(il secondo).

Edit:
Ho provato a creare ed inserire una semplice editText al di fuori del metodo onClick e essa viene creata con lo stile di default, cioè sfondo bianco e sottolineatura. Bah... L'unica cosa che ho modificato nel codice java che mi hai suggerito e che al metodo
Codice (Java): [Seleziona]
.from non gli ho passato
Codice (Java): [Seleziona]
this come contesto() in quanto appariva in una nota "in LayoutInflater cannot be applied to anonymous android.view.View.OnClickListener", cosi ho usato
Codice (Java): [Seleziona]
getApplicationContext() ottenendo comunque ciò che desideravo a parte il problema dello stile
« Ultima modifica: 25 Giugno 2016, 15:54:59 CEST da Ezio1400 »

Online Ohmnibus

  • Utente senior
  • ****
  • Post: 582
  • 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:Creare View tramite codice java e inserirle in file XML tramite bottone
« Risposta #7 il: 26 Giugno 2016, 10:35:56 CEST »
0
Sì, se sei in un OnClickListener "this" è sbagliato perché fa riferimento al gestore del click e non all'activity.

Se hai un metodo:

Codice (Java): [Seleziona]
public void onClick(View v) {
usa il context di v:

Codice (Java): [Seleziona]
ViewGroup newBlock = (ViewGroup) LayoutInflater.from(v.getContext()).inflate(R.layout.layout_block, myContainer, false);
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 Ezio1400

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 10'
Re:Creare View tramite codice java e inserirle in file XML tramite bottone
« Risposta #8 il: 26 Giugno 2016, 11:20:52 CEST »
0
Infatti il problema derivava proprio da quello. Ora lo stile rimane immutato. Grazie infinite  :-)