responseinline
responseinline

Reputation: 11

Communicate between Activity and ViewPager Fragments

Like in the image below, I have an Activity with a ViewPager (with TabLayout) inside. Now I want to refresh for example the text of an TextView in a ViewPager Fragment. How can I do this?

https://i.sstatic.net/GknIX.jpg [Sorry for the image link, but I don't have enough reputations yet.]

I already tried something like this:

//In Activity
View root = getLayoutInflater().inflate(R.layout.fragment_home, null);
TextView textView = (TextView) root.findViewById(R.id.text_view);
textView.setText("test");

But I get a NullPointerException for the textView.

Edit 1: I only need to access the components inside one Fragment, so I am not using an array inside the Adapter. I changed my ViewPagerAdapter to this:

public class ViewPagerAdapter extends FragmentPagerAdapter {
    public HomeFragment fragment;

    ...

    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                return fragment = new HomeFragment();
            case 1:
                ...
            default:
                return null;
        }
    }

But I still get a NullPointerException here:

final Fragment root = viewPagerAdapter.fragment;
Log.d("testtest", String.valueOf(root == null));

Upvotes: 1

Views: 650

Answers (3)

Daniel Nugent
Daniel Nugent

Reputation: 43322

If you only need a reference to one Fragment, then just use the position parameter passed into instantiateItem(), and only assign your Fragment reference for the desired position:

public class ViewPagerAdapter extends FragmentPagerAdapter {
    public HomeFragment fragment;

    //...

    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                return new HomeFragment(); //modified
            case 1:
                ...
            default:
                return null;
        }
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
      Fragment createdFragment = (Fragment) super.instantiateItem(container, position);
      if (position == 0) {
        fragment = (HomeFragment) createdFragment;
      }
      return createdFragment;
    }
}

Upvotes: 0

Masum
Masum

Reputation: 4959

Write this code in your activity where you want to change fragment value. Your fragment id is e.g. my_fragment

Fragment frag = getFragmentManager().findFragmentById(R.id.my_fragment)
((TextView) frag.getView().findViewById(R.id.text_view)).setText(s);

Upvotes: 1

Mohamad Ghafourian
Mohamad Ghafourian

Reputation: 1071

You can create your own Adapter:

private class YourAdapter extends FragmentPagerAdapter implements ViewPager.OnPageChangeListener
{
    Fragment screens[];
    public CheckinHistoryAdapter(FragmentManager fm) {
        super(fm);
        screens = new Fragment[3];
        screens[0] = new CoachFragment();
        screens[1] = new LogingFragment();
        screens[2] = new HistoryFragment();
    }

@Override
public Fragment getItem(int index) {
    if(index <= screens.length)
    {
        return screens[index];
    }
    return null;
}

@Override
public int getCount() {
    return screens.length;
}

}

Use it like this

mViewPager.setAdapter(this.mPagerAdapter);

You can access fragment object with getItem method.

Upvotes: 0

Related Questions