0

我有navigational drawer和每個抽屜項目的片段。現在,在每個片段下,我們使用FragmentPagerAdapter創建了多個片段。如何從不同類的片段中訪問方法?

我有3名抽屜的項目,如HomeGroupFeedback。在Home,有2個片段即My ProfileLogged

所以我創建了一個滑動式的標籤爲My ProfileLogged而這兩個片段是家庭項目下。現在我必須在這兩個片段(My Profile, Logged)中執行一些網絡調用,但是如何確定FragmentPagerAdapter上的哪個片段處於活動狀態?是否有可能停止適配器提前創建碎片。

HomeFragment

 DrawerModel model = new DrawerModel(); 
     LoggedFragment loggedFrag = new LoggedFragment(); 
     loggedFrag.setTargetFragment(loggedFrag, 0); 
     model.setFragment(loggedFrag); 
     dFragments.add(model); 

     model = new DrawerModel(); 
     model.setDrawerTitle(getString(R.string.profile_tab_title)); 
     model.setFragment(new ProfileFragment()); 
     dFragments.add(model); 


     Bundle bundle = new Bundle(); 
     bundle.putSerializable("fragments", dFragments); 
     fragment = new DrawerFragment(); 
     fragment.setArguments(bundle); 
     navigateFragment(fragment); 

DrawerFragment

public class DrawerFragment extends Fragment { 

private FragmentAdapter pagerAdapter; 
private ViewPager mViewPager; 
private ArrayList<DrawerModel> fList; 

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

    fList = (ArrayList<DrawerModel>) getArguments().getSerializable(
      "fragments"); 

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

    pagerAdapter = new FragmentAdapter(getChildFragmentManager(), fList); 

    mViewPager = (ViewPager) v.findViewById(R.id.pager); 
    mViewPager.setAdapter(pagerAdapter); 

    return v; 
} 

} 

FragmentAdapter

public class FragmentAdapter extends FragmentStatePagerAdapter { 

private int TOTAL_TABS = 0; 
private ArrayList<DrawerModel> fragmentList; 
private SparseArray<Fragment> mPageReference = new SparseArray<Fragment>(); 

public FragmentAdapter(FragmentManager fm, ArrayList<DrawerModel> fList) { 
    super(fm); 
    // TODO Auto-generated constructor stub 
    TOTAL_TABS = fList.size(); 
    fragmentList = fList; 

} 

@Override 
public Fragment getItem(int position) { 
    // TODO Auto-generated method stub 

    return fragmentList.get(position).getDrawerFragment(); 
} 

@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return TOTAL_TABS; 
} 

@Override 
public Object instantiateItem(ViewGroup container, int position) { 
    // TODO Auto-generated method stub 
    Fragment fragment = (Fragment) super.instantiateItem(container, 
      position); 
    mPageReference.put(position, fragment); 

    Log.d("FragmentAdapter - OnCreate", mPageReference.size() + ""); 
    return fragment; 
} 

@Override 
public CharSequence getPageTitle(int position) { 
    // TODO Auto-generated method stub 

    return fragmentList.get(position).getDrawerTitle(); 
} 

@Override 
public void destroyItem(ViewGroup container, int position, Object object) { 
    // TODO Auto-generated method stub 
    mPageReference.remove(position); 

    Log.d("FragmentAdapter - onDestroy", mPageReference.size() + ""); 

    super.destroyItem(container, position, object); 

} 

public Fragment getFragment(int key) { 
    return mPageReference.get(key); 
} 

} 

public class LoggedFragment extends Fragment implements OnClickListener { 

TextView tHeader, tEmail, tvPhone; 
SharedPreferences sp; 
ImageView ivAds; 
String bannerUrl = null; 
private Handler handler = new Handler(); 
private static final String TAG = "LoggedFragment"; 

private void addListeners() { 
    // TODO Auto-generated method stub 

    ivAds.setOnClickListener(this); 

} 

Runnable updateImage = new Runnable() { 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 

     if (Utility.checkConnectivity(getActivity())) 
      new ImageTask((Home_Activity) getActivity(), "Logged") 
        .execute(); 

     handler.postDelayed(this, Utility.AD_DURATION); 
    } 
}; 

@Override 
public void onStart() { 
    // TODO Auto-generated method stub 
    super.onStart(); 

    if (handler != null) 
     handler.post(updateImage); 

} 

@Override 
public void onStop() { 
    // TODO Auto-generated method stub 
    super.onStop(); 

    if (handler != null) 
     handler.removeCallbacks(updateImage); 

} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 

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

    bindComponents(v); 
    addListeners(); 

    return v; 
} 

private void bindComponents(View v) { 
    // TODO Auto-generated method stub 

    ivAds = (ImageView) v.findViewById(R.id.ivLoggedAds); 
} 

public void updateBanner(Bitmap bitmap, String url) { 

    ivAds.setImageBitmap(bitmap); 
    bannerUrl = url; 
} 

}

Call to update fragment method

Fragment fragment = activity.getSupportFragmentManager() 
        .findFragmentById(R.id.content_frame) 
        .getTargetFragment(); 

      if (fragment instanceof LoggedFragment) { 

       LoggedFragment logged = (LoggedFragment) fragment; 
       logged.updateBanner(result, parameter[1]); 

      } else 
       Log.d(TAG, "No Logged Fragment Found"); 

現在下登錄我的個人資料片段我需要動態儘快片段獲取一些數據是用戶,但無法看到這樣做?

任何想法/建議,非常感謝。

回答

1

使用下面的代碼,以找到您的片段,

FragmentAdapter pa = (FragmentAdapter)viewPager.getAdapter(); 
pa.getFragment(viewPager.getCurrentItem()).updateBanner(); 

代碼選擇當前可見片段可以通過

pa.getFragment(index of other fragment).updateBanner(); 

將其更改爲另一個必須轉換pa.getFragment(viewPager.getCurrentItem())到你想要的片段爲例如,如果在那個位置它被記錄更改爲下面:

((LoggedFragment)pa.getFragment(viewPager.getCurrentItem())) 
+0

我們正在顯示自定義橫幅廣告,所以我們有從每個片段調用的自定義類,並且方法從自定義類更新。因此,我們需要調用自定義類即異步任務,以獲取橫幅並更新片段方法輪流顯示橫幅下適當的片段 – moDev 2014-12-10 20:10:17

+0

當我嘗試從更新的異步任務'updateBanner'方法它永遠不會更新,它看起來片段不識別。 – moDev 2014-12-10 20:22:59

+0

我知道何時調用'async task',但片段在異步任務中未被識別。請參閱調用以更新問題中的片段代碼。 – moDev 2014-12-10 20:34:15

0

我會說你有兩個不同的選擇。

選項一:使用setTargetFragment()getTargetFragment()所以您可以獲得對您需要的片段的引用。

選項二:使用FragmentManager只需從FragmentManager獲取需要的片段,然後調用您在片段上定義的方法。

+0

我已經試過op重刑二,但它始終顯示空片段。檢查更新的代碼 – moDev 2014-12-04 08:44:16

+0

我想問題是你沒有在FragmentManager上用名字登記它們。 **編輯:**現在我看到你使用'FragmentStatePagerAdapter'。這有點不好,因爲它沒有給出片段的專有名稱。 – rekire 2014-12-04 08:45:09

+0

仍然選項一個不適合我。我更新了代碼 – moDev 2014-12-04 09:48:36

相關問題