2013-01-16 49 views
5

我有兩個片段(Fragment1和Fragment2),創建了與自定義TabListener類的ActionBar導航。每個選項卡的內容都是我的片段之一。但現在我有一個問題 - 我無法訪問/獲取片段的實例。從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 

     } 

    } 

我不能使用getSupportFragmentManager().findFragmentById(id),因爲我沒有ID我也試過getSupportFragmentManager().findFragmentByTag(tag)但它沒有工作,要麼是因爲我只叫add()方法FragmentTransaction類不replace()

這是任何方式獲取當前標籤片段實例,以便我可以調用片段的方法?

+0

更好地解釋你想幹什麼,你有2個片段是什麼,所以你要知道如何創建的每個片段類的方法? – Marckaraujo

+0

我想得到片段的實例,這將允許我調用該片段的方法,傳遞一些變量等。 –

回答

5

我找到了解決方案。我試圖在onActivityResult()方法中獲得片段的實例,並且實際工作。

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

代碼中的哪個位置分配了片段ID(即FRAG1)? – dannyroa

+0

當您調用'FragmentTransaction.add(Fragment,String)'或'FragmentTransaction.replace(int,Fragment,String)'時,您設置了Fragment的標籤,其中標籤是String參數。 – ashishduh

0

我得到的片段從FragmentPagerAdapter例如:

FragmentPagerAdapter adapter = (FragmentPagerAdapter) viewPager.getAdapter(); 
Fragment fragment = adapter.getItem(tabLayout.getSelectedTabPosition()); 
相關問題