2013-01-16 17 views
5

Ho due frammenti (Fragment1 e Fragment2), ho creato la navigazione ActionBar con la classe TabListener personalizzata. Il contant di ogni scheda è uno dei miei frammenti. Ma ora ho un problema: non riesco ad accedere alle istanze di frammento.Ottieni frammento corrente dalla scheda ActionBar

public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     getSupportActionBar().setNavigationMode(getSupportActionBar().NAVIGATION_MODE_TABS); 

     Tab tab = getSupportActionBar().newTab() 
      .setText(R.string.frag1) 
      .setTabListener( 
       new MyTabListener(this, 
        Fragment1.class.getName())); 
     getSupportActionBar().addTab(tab); 

     tab = getSupportActionBar().newTab() 
      .setText(R.string.frag2) 
      .setTabListener( 
       new MyTabListener(this, 
        Fragment2.class.getName())); 
     getSupportActionBar().addTab(tab); 

     Fragment1 f1 = (Fragment1) getSupportFragmentManager().findFragmentByTag("FRAG1"); 
     if(f1 != null) { 
      Toast.makeText(this, "It's not empty", Toast.LENGTH_SHORT).show(); 
     } 
    } 


    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     Toast.makeText(this, "Photo Intent Goes Here", Toast.LENGTH_SHORT).show(); 

     if(data != null) { 
      Toast.makeText(this, "It's not empty", Toast.LENGTH_SHORT).show(); 

      if (resultCode == RESULT_OK) { 


       } 

     } else { 
      Toast.makeText(this, "It's empty", Toast.LENGTH_SHORT).show(); 
     } 
    } 

    private class MyTabListener implements TabListener 
    { 
     private SherlockFragment mFragment; 
     private final Activity mActivity; 
     private final String mFragName; 

     public MyTabListener(Activity activity, 
      String fragName) 
     { 
      mActivity = activity; 
      mFragName = fragName; 
     } 


     @Override 
     public void onTabSelected(Tab tab, 
       android.support.v4.app.FragmentTransaction ft) { 
      mFragment = (SherlockFragment) SherlockFragment.instantiate(mActivity, 
        mFragName); 

      if(mFragment instanceof Fragment1) { 
       Fragment1 f1temp = (Fragment1) mFragment; 

       //Toast.makeText(mActivity, "Frag1", Toast.LENGTH_SHORT).show(); 

        ft.add(android.R.id.content, mFragment,"FRAG1"); 
      } 

      else { 
        ft.add(android.R.id.content, mFragment,"ELSE"); 
      } 


      //Toast.makeText(mActivity, mFragName, Toast.LENGTH_SHORT).show(); 
     } 

     @Override 
     public void onTabUnselected(Tab tab, 
       android.support.v4.app.FragmentTransaction ft) { 
      ft.remove(mFragment); 
      mFragment = null; 

     } 

     public SherlockFragment getCurrentFragment() { 
      return mFragment; 
     } 

     @Override 
     public void onTabReselected(Tab tab, 
       android.support.v4.app.FragmentTransaction ft) { 
      // TODO Auto-generated method stub 

     } 

    } 

non posso usare getSupportFragmentManager().findFragmentById(id), perché non ho id anche io ho provato getSupportFragmentManager().findFragmentByTag(tag), ma non ha funzionato o perché ho solo chiamo add() metodo FragmentTransaction di classe non replace()

E 'un modo per ottenere l'istanza del frammento della scheda corrente in modo da poter chiamare i metodi di frammento?

+0

spiegare meglio ciò che si cerca di fare, hai 2 frammenti, così si vuole sapere come creare i metodi per ogni classe Frammento? – Marckaraujo

+0

Voglio ottenere l'istanza di frammento, che consentirebbe di chiamare metodi del frammento, passare alcune variabili, ecc. –

risposta

5

Ho trovato una soluzione. Ho provato ad ottenere l'istanza del frammento nel metodo onActivityResult() e questo ha funzionato.

public void onActivityResult(int requestCode, int resultCode, Intent data) { 

Toast.makeText(this, "Photo Intent Goes Here", Toast.LENGTH_SHORT).show(); 

     if(data != null) { 
      Toast.makeText(this, "It's not empty", Toast.LENGTH_SHORT).show(); 

      if (resultCode == RESULT_OK) { 
        Fragment1 f1 = (Fragment1) getSupportFragmentManager().findFragmentByTag("FRAG1"); 
        f1.onCameraResult(requestCode,resultCode,data); // Your method of the fragment 

       } 

     } else { 
      Toast.makeText(this, "It's empty", Toast.LENGTH_SHORT).show(); 
     } 
    } 
+6

Dove nel codice è stato assegnato l'ID frammento (cioè FRAG1)? – dannyroa

+0

Si imposta un tag di Fragment quando si chiama 'FragmentTransaction.add (Fragment, String)' o 'FragmentTransaction.replace (int, Fragment, String)', dove il tag è il parametro 'String'. – ashishduh

0

ricevo frammento FragmentPagerAdapter esempio:

FragmentPagerAdapter adapter = (FragmentPagerAdapter) viewPager.getAdapter(); 
Fragment fragment = adapter.getItem(tabLayout.getSelectedTabPosition()); 
Problemi correlati