Autore Topic: Modificare/Aggiungere views in un Fragment dinamicamente  (Letto 363 volte)

Offline Mondo

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Github
    • Google+
    • ------
    • ------
    • ------
    • Mostra profilo
  • Dispositivo Android:
    ------
  • Play Store ID:
    ------
  • Sistema operativo:
    Windows 7
Modificare/Aggiungere views in un Fragment dinamicamente
« il: 08 Aprile 2013, 17:01:30 CEST »
0
Buon pomeriggio a tutti.
Apro questo topic perché spero che almeno voi programmatori android italiani possiate darmi una mano. ( Ho postato in altri forum il mio problema, ho cercato su google, però non sono ancora soddisfatto delle risposte che ho ricevuto o che ho trovato ).

Il mio obbiettivo è quello di aggiungere dinamicamente delle TextViews e degli EditTexts all'onClick di un bottone.
Sono riuscito ad aggiungerli dinamicamente, ma, quando scorro i Fragments mediante lo swipe orizzontale e ritorno al frammento in cui ho aggiunto le views, esse non ci sono più. Spariscono! Questo è colpa del ciclo di vita di un frammento, perché ogni volta che viene nuovamente visualizzato vi è il richiamo al metodo onCreateView(...), quindi ritorna allo stato di creazione.

In realtà il problema l'avevo risolto in un modo: Ho creato una classe che conteneva tutti i componenti da visualizzare dinamicamente all'onClick
Codice (Java): [Seleziona]
        private class SubClass
        {
                private View line;
                private TextView clabel;
                private EditText cname;
                private TextView lvlabel;
                private EditText lvnumber;
               
               
                public SubClass(View line, TextView clabel, EditText cname, TextView lvlabel,
                                EditText lvnumber){
                       
                        this.line = line;
                        this.clabel = clabel;
                        this.cname = cname;
                        this.lvlabel = lvlabel;
                        this.lvnumber = lvnumber;
                       
                        setText();
                }
               
                private void setText(){
                        clabel.setText(getString(R.string.c));
                        lvlabel.setText(getString(R.string.lv));
                }
               
                public View getLine(){
                        return line;
                }
               
                public TextView getClabel(){
                        return clabel;
                }
               
                public EditText getCname(){
                        return cname;
                }
               
                public TextView getLv_label(){
                        return lvlabel;
                }
               
                public EditText getLv_number(){
                        return lvnumber;
                }
        }
Fatto ciò, dichiaravo come attributo della classe madre una LinkedList<SubClass> e ogni qualvolta che cliccavo sul pulsante per aggiungere gli elementi, prima li aggiungevo nella mia LinkedList  e dopo li visualizzavo a video; se invece scorrevo con lo swipe e ritornavo al frammento in cui volevo queste views dinamiche, creavo un metodo ( all'interno di onCreateView(...) ) che andava a riposizionarmi le views, salvate nelle lista, a schermo.
Però il tutto mi è sembrato molto sporco e macchinoso! Per questo son qui da voi a chiedere il vostro aiuto.
Io credo che ci sia qualche modo per salvare le views senza ricrearle da 0 e senza ovviare al problema come ho fatto io...

Di seguito un esempio banale del problema:

FragmentActivity class:
Codice (Java): [Seleziona]
public class MainActivity extends FragmentActivity {

        MyAdapter mAdapter;
        ViewPager vp;  
       
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
               
                mAdapter = new MyAdapter(getSupportFragmentManager());
               
                vp = (ViewPager) findViewById(R.id.pager);
                vp.setAdapter(mAdapter);
}

Fragment class:
Codice (Java): [Seleziona]
public final class Tab1 extends Fragment
{
        public static View layout;
        private LinearLayout ll;
        int id = 0;
       
        public static Tab1 newInstance(){                      
                return new Tab1();
        }
       
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {      
                layout = inflater.inflate(R.layout.tab1, container, false);
                ll = (LinearLayout) layout.findViewById(R.fragment.ll2);
                return layout;
        }
       
        @Override
        public void onActivityCreated (Bundle savedInstanceState){
                super.onActivityCreated(savedInstanceState);
                final Button b = (Button) layout.findViewById(R.fragment.b1);

                b.setOnClickListener(new OnClickListener(){

                        @Override
                        public void onClick(View v) {
                                insertItems();
                        }});
        }
       
        private void insertItems(){
                TextView tv = new TextView(getActivity());
               
                tv.setText("Testo nr." + id);
                tv.setId(id); id++;
               
                ll.addView(tv);
        }
}

FragmentPagerAdapter class:
Codice (Java): [Seleziona]
public class MyAdapter extends FragmentPagerAdapter
{

        public MyAdapter(FragmentManager fm) {
                super(fm);

        }

        @Override
        public Fragment getItem(int position) {

                switch(position)
                {
                        case 0:
                                return Tab1.newInstance();
                               
                        case 1:
                                return Tab2.newInstance();
                               
                        case 2:
                                return Tab3.newInstance();
                }
                return null;
        }

        @Override
        public int getCount() {
               
                return 3;
        }
       
        @Override
        public CharSequence getPageTitle(int position) {
                switch (position)
                {
                case 0:
                        return "Tab1";
                case 1:
                        return "Tab2";
                case 2:
                        return "Tab3";
                }
                return null;
        }
}