2013-05-11 14 views
6

Ho 3 sherlockListFragments nella mia app. Ogni frammento ha alcuni editTexts e l'ultimo frammento ha un pulsante che quando viene premuto tutti i dati nel primo e secondo frammento devono essere accessibili e memorizzati. Ho usato il bundle per inviare dati tra i frammenti. con il semplice esempio seguente, Questo è il codice del mio primo frammento:utilizzando il pacchetto per passare i dati tra i frammenti in un altro esempio di frammento

public class PersonalDataFragment extends SherlockListFragment { 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    View v = inflater.inflate(R.layout.fragmet_personal_data, container, false); 

    return v; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    PersonalDataFragment fragment = new PersonalDataFragment(); 
    Bundle bundle = new Bundle(); 
    bundle.putString("y", "koko"); //any string to be sent 
    fragment.setArguments(bundle); 

    super.onCreate(savedInstanceState); 
} 

} e questo è il codice del frammento che riceve il testo:

public class WorkExpRefFragment extends SherlockListFragment { 
String myInt; 

@Override 
public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_workexp_ref, container, false); 


    final EditText t = (EditText) view.findViewById(R.id.editText5); 
    final Button generate = (Button)view.findViewById(R.id.button2); 

    generate.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      t.setText(myInt + "sadfigha"); 
     } 
    }); 
    return view; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    Bundle bundle = this.getArguments(); 
    if(getArguments()!=null) { 
     myInt = getArguments().getString("y"); 
    } 

    super.onCreate(savedInstanceState); 
} 

}

Ora ho un null nel terzo frammento, cosa dovrei fare? Grazie in anticipo

risposta

6

È normale che il codice non funzioni. Nel primo frammento tutto ciò che devi fare è creare una nuova istanza di PersonalDataFragment e passarla a Bundle con i dati. Il problema è che sebbene frammento contenga i dati nello Bundle, il frammento stesso non è quello utilizzato dall'app (non è nemmeno collegato allo Activity). È inoltre possibile impostare Bundle su un'istanza PersonalDataFragment ma si tenta di accedere ai dati in un WorkExpRefFragment che evidentemente non funziona poiché i due frammenti non hanno una connessione diretta.

Una soluzione semplice per quello che vuoi fare è lasciare che il Activity "salva" i dati per i tuoi frammenti dato che lo Activity è disponibile per tutti i frammenti. In primo luogo creare due metodi nel Activity tenendo i tre frammenti:

public void saveData(int id, Bundle data) { 
    // based on the id you'll know which fragment is trying to save data(see below) 
    // the Bundle will hold the data 
} 

public Bundle getSavedData() { 
    // here you'll save the data previously retrieved from the fragments and 
    // return it in a Bundle 
} 

Poi i tuoi frammenti saranno salvare i propri dati in questo modo:

public class PersonalDataFragment extends SherlockListFragment { 

    // this will identify the PersonalDataFragment fragment when trying to save data 
    public void static int id PERSONAL_ID = 1; 
    //... 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Bundle bundle = new Bundle(); 
     bundle.putString("y", "koko"); //any string to be sent 
     YourActivity activity = (YourActivity) getActivity(); 
     activity.saveData(PERSONAL_ID, bundle); 
    }  
} 

per recuperare i dati nel WorkExpRefFragment frammento:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    YourActivity activity = (YourActivity) getActivity(); 
    Bundle savedData = activity.getSavedData(); 
} 

A seconda di come sono stati utilizzati questi frammenti, questa soluzione potrebbe non funzionare. Inoltre, tieni presente che lo Bundle che passi come sopra non verrà conservato per una modifica alla configurazione.

+0

Grazie per la risposta, funziona per me ma ho bisogno di ottenere i dati quando il pulsante (in terzo frammento) non viene premuto quando il primo frammento. è creato. voglio che venga mantenuto per un cambio di configurazione. Quindi, cosa dovrei fare? – Fareed

+0

L'ho preso e ho creato listener AddTextChanged :) Grazie – Fareed

Problemi correlati