Autore Topic: Disposizione dinamica di View in un Layout  (Letto 514 volte)

Offline EnRyYyYy

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Disposizione dinamica di View in un Layout
« il: 16 Marzo 2012, 11:06:15 CET »
0
Ciao a tutti, ho un problema con l'inserimento/rimozione di elementi dinamici all'interno di un layout.
Praticamente io ho creato un layout in XML con due pulsanti "Aggiungi" e "Reset" e un relativeLayout vuoto. A runtime cliccando sul pulsante aggiungi aggiungo dinamicamente dei pulsanti al relative layout vuoto. Ciascuno di questi pulsanti può essere cliccato e così facendo scompare dal relativelayout. Quello che vorrei è che ogni volta che aggiungo/rimuovo un pulsante dal layout, i rimanenti mi si ordinino sullo schermo automaticamente (e se sono troppi mi si sovrappongano). Per far questo ho creato il metodo refreshLayout() ma ogni volta che lo richiamo mi viene visualizzato solo l'ultimo child contenuto all'interno del relativelayout. Vi riporto il codice della mia activity:
Codice (Java): [Seleziona]
public class TestActivity extends Activity {
        private final int baseId=1048637;
        public RelativeLayout myRelative;
        public Button myAdd;
        public Button myReset;
        public RelativeLayout.LayoutParams lp;
        public int n;
        @Override
        public void onCreate(Bundle savedInstanceState){
                super.onCreate(savedInstanceState);
                this.setContentView(R.layout.main);
                n=0;
                myRelative=(RelativeLayout)this.findViewById(R.id.my_relative);
                myReset=(Button)this.findViewById(R.id.my_delete);
                myReset.setOnClickListener(new OnClickListener(){

                        public void onClick(View arg0) {
                               
                                myRelative.removeAllViews();
                                n=0;
                                refreshMyRelativeLayout();
                        }
                       
                });
                myAdd=(Button)this.findViewById(R.id.my_add);
                myAdd.setOnClickListener(new OnClickListener(){

                        public void onClick(View arg0) {
                                Button btn=new Button(myRelative.getContext());
                                btn.setText("Test"+n);
                                int id=Integer.valueOf(Integer.toString(baseId)+Integer.toString(n));
                                btn.setId(id);
                                btn.setOnClickListener(new OnClickListener(){

                                        public void onClick(View arg0) {
                                                myRelative.removeView(arg0);
                                                refreshMyRelativeLayout();
                                        }

                                       
                                });
                                myRelative.addView(btn);
                                refreshMyRelativeLayout();
                                n++;
                        }
                       
                });
                myReset=(Button)this.findViewById(R.id.my_delete);
               
               
        }
       
        public void refreshMyRelativeLayout(){
                if(myRelative.getChildCount()!=0){
                        int margin=myRelative.getWidth()/myRelative.getChildCount();
                        lp= new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT);
                        for (int i=0;i<myRelative.getChildCount();i++){
                                lp.setMargins(margin*i, 0, 0, 0);
                                myRelative.getChildAt(i).setLayoutParams(lp);
                                myRelative.getChildAt(i).postInvalidate();
                        }
                       
                }
        }

}

Molto probabilmente è una cosa stupida riguardante il modo in cui android gestisce i viewgroup, però non so proprio. Ho cercato su internet ma sembro essere l'unico al mondo a porsi il problema. Così mi son deciso a chiedere agli esperti ;-)

Offline pivoide

  • Utente junior
  • **
  • Post: 133
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Samsung galaxy tab 10.1
  • Play Store ID:
    codicerosso
  • Sistema operativo:
    Ubuntu 11.04
Re:Disposizione dinamica di View in un Layout
« Risposta #1 il: 16 Marzo 2012, 11:38:31 CET »
0
Con una cosa simile mi sono incasinato pure io da buon pivello di android. L'ho risolta così (v è una view creata a runtime all'interno di un ciclo, layout è un RelativeLayout)
In fase di inserimento della view:
Codice (Java): [Seleziona]
LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.leftMargin = x;
params.topMargin = y;
layout.addView(v, params);

Per spostamenti successivi all'inserimento imposto le proprietà left, top, right e bottom delle view.

Non so se sia la maniera migliora ma al momento mi accontento che funzioni
Odio l'inglese e per un informatico non è il massimo

Offline EnRyYyYy

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Disposizione dinamica di View in un Layout
« Risposta #2 il: 16 Marzo 2012, 16:28:26 CET »
0
Grazie mille, ora tutto funziona!!! :D
Scrivo qui casomai servisse a qualcuno...
Bastava semplicemente mettere il
Codice (Java): [Seleziona]
LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); dentro il ciclo...evidentemente se non lo ricreo nuovo ogni volta i parametri vengono passati a tutti gli oggetti del viewgroup :P