techDigi
techDigi

Reputation: 251

Open Second fragment of a tabFragment from the Activity

Actually in my code i am implementing a Tab Fragment and i m adding the viewPager code in the Fragment and i'm calling the fragment from the activity.. and it works well but i need to open the second fragment sometimes so how can i load the second fragment from the activity. Here is my code:

public class TabFragment extends Fragment {
public static TabLayout tabLayout;
public static ViewPager viewPager;
public static int int_items = 2;
protected FragmentActivity mActivity;
MyAdapter adapter;
View x;
Offers offersFragment;

public TabFragment() {
    // Required empty public constructor
}

public void onBackPressed() {
    // do stuff
    viewPager.setCurrentItem(0, true);
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    mActivity = (FragmentActivity) activity;
}


public void navigateFragment(int position){

    viewPager.setCurrentItem(position, true);

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    x = inflater.inflate(R.layout.content_main_menu, null);
    tabLayout = x.findViewById(R.id.tabs);
    viewPager = x.findViewById(R.id.viewpager);
    setupViewPager(viewPager);
    //viewPager.setAdapter(new MyAdapter(getChildFragmentManager()));
    viewPager.setOffscreenPageLimit(1);
    tabLayout.post(new Runnable() {
        @Override
        public void run() {
            tabLayout.setupWithViewPager(viewPager);
        }
    });
    return x;
}

@RequiresApi(api = Build.VERSION_CODES.KITKAT)
@Override
public void onDetach() {
    super.onDetach();

    try {
        Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager");
        childFragmentManager.setAccessible(true);
        childFragmentManager.set(this, null);

    } catch (NoSuchFieldException | IllegalAccessException e) {
        throw new RuntimeException(e);
    }
}


private void setupViewPager(ViewPager viewPager) {
    adapter = new MyAdapter(getChildFragmentManager());
    adapter.addFragment(new HomeFragment(), "HOME");
    adapter.addFragment(new Offers(), "OFFERS");

    viewPager.setAdapter(adapter);


}


private class MyAdapter extends FragmentPagerAdapter {
    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    public MyAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }

    void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }


    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        return super.instantiateItem(container, position);
    }
}


    }

call from the activity :

                    Log.e("lifecycle", "enter");
                    fragobjTab = (TabFragment) getSupportFragmentManager().findFragmentById(R.id.containerView);

                    fragobjTab.navigateFragment();

Logs :

on a null object reference and than crash

Upvotes: 0

Views: 1400

Answers (3)

Dhruv Tyagi
Dhruv Tyagi

Reputation: 812

As the Abhishek Dubey mentioned in the answer, use viewPager.setCurrentItem() method.

use this code :

Fragment fragment = new TabFragment();
                Bundle   bundle = new Bundle();
                bundle.putInt("viewpager", 2);
                /*the above value 2 indicates the second fragment*/
                fragment.setArguments(bundle);
                FragmentTransaction transaction =
                        getSupportFragmentManager().beginTransaction();

                transaction.replace(R.id.containerView, fragment,"SOMETAG").commit();

in the fragment add this code in your onCreateView :

Bundle bundle = this.getArguments();
    if (bundle != null) {
        int pageNumber=bundle.getInt("viewpager");
    viewPager.setAdapter(adapter);
    viewPager.setCurrentItem(pageNumber);
    }

Upvotes: 2

Jackey kabra
Jackey kabra

Reputation: 199

To show a new fragment in the current Activity you can use a FragmentTransaction:

// Make newIstance method in your fragment.
Fragment fragment = CustomFragment.newInstance();

FragmentTransaction transaction = 
getSupportFragmentManager().beginTransaction();

transaction.replace(R.id.container_layout, fragment).commit();

Upvotes: 0

Abhishek Dubey
Abhishek Dubey

Reputation: 945

viewPager.setAdapter(adapter);
viewPager.setCurrentItem(2);

Now the second Fragment would be opened.

Upvotes: 3

Related Questions