2012-11-18 9 views
28

Ive ha già fatto una domanda simile e non ha ottenuto risposta e sembra che molti altri richiedano una risposta. Quindi sto postando questa domanda per ottenere una risposta chiara che tutti possano beneficiare.Condivisione dei dati tra frammenti e attività in Android

Ho un'attività con 2 frammenti. Voglio framment2 per impostare una variabile booleana in Attività quando una casella di controllo è selezionata in modo che frammento1 possa sapere se la casella di controllo è stata selezionata.

Questo è il mio codice:

attività:

public class modestab extends Activity{ 
    public static Context appContext; 

    public boolean lf=false; 

    public void onCreate(Bundle savedInstanceState){ 
     appContext=this; 
super.onCreate(savedInstanceState); 
ActionBar tabbar= getActionBar(); 
     tabbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
     ActionBar.Tab ModesTab =tabbar.newTab().setText("Modes"); 
     ActionBar.Tab CatTab =tabbar.newTab().setText("Categories"); 

     Fragment ModesFragment =new modes(); 
     Fragment CatFragment =new cats(); 

     ModesTab.setTabListener(new MyTabsListener(ModesFragment)); 
     CattTab.setTabListener(new MyTabsListener(CatFragment)); 

     tabbar.addTab(ModesTab); 
     tabbar.addTab(CatTab); 


    } 

Frammento 1: (dove voglio leggere il lf booleano impostato in acitivity sopra:

@TargetApi(11) 
public class tabmodes extends Fragment{ 
@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
View V=inflater.inflate(R.layout.tab_modes, container, false); 
button1.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       if(lf==false) //lf here is the lf in Activity which I want to get 

Frammento 2: Dove Voglio impostare lf nell'attività

..... 
lifecheck.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){ 
       @Override 
       public void onCheckedChanged(CompoundButton buttonView, 
         boolean isChecked) { 
        if(lifecheck.isChecked()) 
         getActivity().lf=true;//Where I want to set the lf flag in Activity 
        ; 
       } 
      }); 

Il codice non viene compilato e non so come impostare lf nell'attività né come leggerlo. Qualcuno mi ha suggerito di fare getActivity() ma non sono in grado di vedere la variabile.

ho cercato di creare una funzione setlf (jk booleano), ma anche io non sono in grado di vederlo ...

Ogni aiuto è benvenuto :)

risposta

2

È possibile passare dati tra i frammenti in due modi ,

In primo luogo, è possibile farlo utilizzando setArguments(...) e getArguments(....)

In secondo luogo, è possibile farlo utilizzando Call back

+0

È questo l'unico modo per condividere dati passando argomenti tra i frammenti? non posso impostare e ottenere direttamente le variabili nell'attività? –

+1

Altrimenti puoi usare sharedpreferences per la condivisione dei dati – RajeshVijayakumar

+0

Sono abbastanza nuovo per questo, hai qualche esempio su setArguments e getArguments –

102

Molti modi:

1) Attività -> Frammento

2) Attività -> Frammento

3) Fragment -> Attività

  • Nel Frammento: creare un'interfaccia ONU con metodi getter e setter (callback methods)
  • nella vostra attività : implementare l'interfaccia

4) Fragment -> Attività

  • nella vostra attività: Creare getter pubblico e setter o altri metodi
  • Nel Frammento: chiamato attività pubblica getter, setter o altri metodi che utilizzano:

    getActivity() .getSomething(), getActivity() .setSomething (args) o getActivity() .someMethod (args)

+3

Hai appena risolto un grosso problema per me e mi hai salvato un sacco di lavoro. Grazie! –

+3

Ottimo riassunto! Mi piacerebbe che i documenti avessero qualcosa di simile all'inizio ... – Claudio

+0

perché è male usare una variabile statica. e non possiamo usare un oggetto statico invece di metodi e variabili statici –

-2
//In fragment; 
String user = MainActivity.getUserName(); 

I metodi statici sono la mia soluzione precedente, ma decisamente una soluzione sbagliata. Non usarli in questo modo.

+2

Sicuramente non è una buona soluzione. –