Saltar para conteúdo


Foto
- - - - -

[Dúvida] Gerar TextView dinamicamente


  • Por favor inicie sessão para responder
4 respostas a este tópico

#1 pedromcosta

pedromcosta

    Membro

  • Membros
  • PipPip
  • 34 mensagens

Mensagem publicada 28 March 2011 - 10:08

Boas,Eu passo a explicar a minha dúvida, porque pode vir a ser a de mais alguém daqui a uns tempos.Eu tenho este layout definido para mostrar os contactos de uma pessoa, porque existe sempre um contacto:Imagem colocadaMas eu quero que caso haja mais do que 1 contacto (no caso de haver o nr de telemovel e o nr de casa por exemplo) que o layout do segundo ou do terceiro contacto seja gerado dinamicamente.assim(com os 2 e 3 gerados dinamicamente):Imagem colocadaO meu problema é que se não tentar usar o layout já existente e criar tudo dinamicamente (scrollView, LinearLayout, RelativeLayout) os dados são mostrados como eu quero(igual à imagem de cima, mas caso queira adicionar o layout criado dinamicamente ao já existente dá sempre excepção.O que é que estou a fazer mal ?O meu códigocontacto.javapackage dreamincode.tutorials.dic_tut3;import android.app.Activity;import android.os.Bundle;import android.widget.RelativeLayout;import android.widget.ScrollView;import android.widget.LinearLayout;import android.widget.TextView;public class dic_tut3 extends Activity { int id = 1; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //ScrollView sv = new ScrollView(this); ScrollView sv = (ScrollView) findViewById(R.id.scrollView); //LinearLayout ll = new LinearLayout(this); LinearLayout ll = (LinearLayout) findViewById(R.id.linearLayout); ll.setOrientation(LinearLayout.VERTICAL); RelativeLayout layout = new RelativeLayout(this); ll.addView(layout); sv.addView(ll); TextView tv = new TextView(this); tv.setId(id); tv.setText("Contactos Adicionais"); layout.addView(tv); RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.FILL_PARENT); TextView tv1 = new TextView(this); tv1.setId(++id); tv1.setText("Contactos: "); lp.addRule(RelativeLayout.BELOW, tv.getId()); layout.addView(tv1, lp); RelativeLayout.LayoutParams lp2 = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.FILL_PARENT); TextView tv2 = new TextView(this); tv2.setId(++id); tv2.setText("912785535"); lp2.addRule(RelativeLayout.RIGHT_OF, tv1.getId()); lp2.addRule(RelativeLayout.BELOW, tv.getId()); layout.addView(tv2, lp2); RelativeLayout.LayoutParams lp3 = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.FILL_PARENT); TextView tv3 = new TextView(this); tv3.setId(++id); tv3.setText("Tipo: "); lp3.addRule(RelativeLayout.BELOW, tv2.getId()); layout.addView(tv3, lp3); RelativeLayout.LayoutParams lp4 = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.FILL_PARENT); TextView tv4 = new TextView(this); tv4.setId(++id); tv4.setText("Telefone"); lp4.addRule(RelativeLayout.RIGHT_OF, tv3.getId()); lp4.addRule(RelativeLayout.BELOW, tv2.getId()); layout.addView(tv4, lp4); RelativeLayout.LayoutParams lp5 = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.FILL_PARENT); TextView tv5 = new TextView(this); tv5.setId(++id); tv5.setText("Observações: "); lp5.addRule(RelativeLayout.BELOW, tv4.getId()); layout.addView(tv5, lp5); RelativeLayout.LayoutParams lp6 = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.FILL_PARENT); TextView tv6 = new TextView(this); tv6.setId(++id); tv6.setText(""); lp6.addRule(RelativeLayout.BELOW, tv4.getId()); lp6.addRule(RelativeLayout.RIGHT_OF, tv5.getId()); layout.addView(tv6, lp6); this.setContentView(sv); }}contacto.xml

#2 pedronveloso

pedronveloso

    Veloso

  • Administradores
  • 1578 mensagens
  • S8

Mensagem publicada 28 March 2011 - 17:25

Olá.Para a próxima coloca o código no pastebin.com, porque aqui é, como podes ver, complicado de o ler.Assim à primeira vista, penso que o teu erro poderá ser estares a referenciar um layout diferente do que deverias, ou seja:"setContentView(R.layout.main);//ScrollView sv = new ScrollView(this);ScrollView sv = (ScrollView) findViewById(R.id.scrollView);"Dizes que o teu ficheiro de layout se chama contacto.xml, mas ali tens setContentView(R.layout.main) , segundo o código deveria ser R.layout.contacto .

#3 pedromcosta

pedromcosta

    Membro

  • Membros
  • PipPip
  • 34 mensagens

Mensagem publicada 29 March 2011 - 08:53

Pedro, obrigado pela resposta :)Ainda continuo sem conseguir fazer o que quero, e sei como resolve-lo mas também não estou a conseguir :) O que dizes do setContentView até tem lógica, mas acaba por ficar sem efeito porque no fim do código eu volto a fazer o "this.setContentView(sv)" para adicionar a scrollview e não o "R.layout.main", o que acaba por não estar lá a fazer nada.O meu problema está mesmo em criar N textviews todas com nomes dinâmicos.. porque até agora eu tive que as criar como tv1, tv2, tv3, etc e caso existam 10 contactos é impossível mostra-los..A única solução que eu vejo é criar todas as textviews dinâmicamente (tv+i) só que no java não dá para fazer isso..Já vi pessoas a dizer como solução usar ArrayLists e coisas do género mas acaba por dar ao mesmo porque acabo por não conseguir criar a tv+i(tv1), a tv+i(tv2), a tv+i(tv3), acabo é por ter a tv1 guardada na posição[1], a tv2 guardada na posição [2] e isto não me interessa porque se reparares eu preciso da tv+i para adicionar atributos.Conheces alguma alternativa a isto ?

#4 pedronveloso

pedronveloso

    Veloso

  • Administradores
  • 1578 mensagens
  • S8

Mensagem publicada 29 March 2011 - 09:13

Conheço uma boa alternativa, ListView. Os elementos de uma listview podem ser do tipo de um layout xml que definiste, ou seja, conter num só elemento vários textviews, uma image view.. o que for necessário. Serve perfeitamente o teu caso. Até ficas sem precisas de usar como Layout exterior um Scroolable porque a ListView já trata da funcionalidade de scrool. A aplicação de Contactos do Android é uma listview por exemplo.

#5 pedromcosta

pedromcosta

    Membro

  • Membros
  • PipPip
  • 34 mensagens

Mensagem publicada 29 March 2011 - 12:24

Era uma boa hipótese, e era a minha ultima alternativa, mas já descobri o que queria.. finalmente :)Criei um array de textviews desta forma:TextView[] tvs;tvs = new TextView[tamanho dos elementos];tvs[i] = new TextView(this);e assim conseguia aceder aos métodos da textview que era o que eu queria..e depois era só fazer tvs[i].setText("Exemplo");Mas de qualquer maneira obrigado pela ajuda:laugh: