2013-01-16 14 views
5

Mam dwa fragmenty (Fragment1 i Fragment2), utworzyłem nawigację ActionBar z niestandardową klasą TabListener. Contant każdej zakładki jest jednym z moich fragmentów. Ale teraz mam problem - nie mogę uzyskać dostępu/uzyskać fragmentów instancji.Pobierz bieżący fragment z karty 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 

     } 

    } 

nie mogę używać getSupportFragmentManager().findFragmentById(id), bo nie mam id również próbowałem getSupportFragmentManager().findFragmentByTag(tag) ale to nie działało, bo tylko zadzwonić add() metoda FragmentTransaction klasę nie replace()

Czy jest jakiś sposób, aby uzyskać aktualną instancję fragmentu karty, aby móc wywoływać metody fragmentów?

+0

lepiej wyjaśnić, co chcesz zrobić, masz 2 fragmenty, więc chcesz wiedzieć, jak utworzyć metody dla każdej klasy Fragment? – Marckaraujo

+0

Chcę uzyskać instancję fragmentu, która pozwoliłaby mi wywoływać metody tego fragmentu, przekazywać niektóre zmienne, itp. –

Odpowiedz

5

Znalazłem rozwiązanie. Próbowałem uzyskać wystąpienie fragmentu w metodzie onActivityResult() i to faktycznie zadziałało.

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

Gdzie w kodzie przypisano identyfikator fragmentu (tj. FRAG1)? – dannyroa

+0

Ustawiasz znacznik Fragmentu, gdy wywołasz 'FragmentTransaction.add (Fragment, String)' lub 'FragmentTransaction.replace (int, Fragment, String)', gdzie tag jest parametrem 'String'. – ashishduh

0

uzyskać fragment z FragmentPagerAdapter przykład:

FragmentPagerAdapter adapter = (FragmentPagerAdapter) viewPager.getAdapter(); 
Fragment fragment = adapter.getItem(tabLayout.getSelectedTabPosition()); 
Powiązane problemy