Reputation: 251
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
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
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
Reputation: 945
viewPager.setAdapter(adapter);
viewPager.setCurrentItem(2);
Now the second Fragment would be opened.
Upvotes: 3