0

I have navigational drawer and fragment for each drawer item. Now Under each fragment we have created multiple fragments using FragmentPagerAdapter.

I've 3 drawer items as Home, Group and Feedback. Under Home, there are 2 fragments i.e My Profile and Logged

so i've created a swipeable tabs for My Profile and Logged and these two fragments are under home item. Now i've to do some network calls in both the fragments(My Profile, Logged) but how to identify which fragment is active on FragmentPagerAdapter? Is it possible to stop adapter to create fragments in advance.

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);
}

}

Logged Fragment

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");

Now under logged and my profile fragment i need to fetch some data dynamically as soon fragment is visible to user but unable to do so?

Any ideas/suggestions is highly appreciated.

moDev
  • 5,248
  • 4
  • 33
  • 63

2 Answers2

2

use below code to find your fragment,

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

the code select current visible fragment you can change it to other one by

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

you must cast pa.getFragment(viewPager.getCurrentItem()) to what fragment you want for example if at that position it is logged change it to below:

((LoggedFragment)pa.getFragment(viewPager.getCurrentItem()) )
mmlooloo
  • 18,937
  • 5
  • 45
  • 64
  • We are displaying custom banner ads, so we have custom class that's called from each fragment and method is updated from custom class.so we need to just call custom class i.e Async Task that fetches the banner and updates the fragment method which in turns displays the banner under appropriate fragment – moDev Dec 10 '14 at 20:10
  • when i try to `updateBanner` method of fragment from async task it never updates and it looks fragment is not identified. – moDev Dec 10 '14 at 20:22
  • I know when to call `async task` but fragment is not identified in async task. see call to update Fragment code in the question. – moDev Dec 10 '14 at 20:34
0

I would say you have two differnt options.

Option one: Use setTargetFragment() and getTargetFragment() so you get a reference to that fragment you need.

Option two: Use the FragmentManager simply get that Fragment you need from the FragmentManager and call that methods you defined on your Fragment.

rekire
  • 47,260
  • 30
  • 167
  • 264
  • I've tried with option two but it always shows null fragment. check the updated code – moDev Dec 04 '14 at 08:44
  • I guess the problem is that you did not registed them with a name on the FragmentManager. **Edit:** now I see that you use the `FragmentStatePagerAdapter`. That is a little bad because it does not give the fragments proper names. – rekire Dec 04 '14 at 08:45