2017-11-27 4 views
0

Eigentlich in meinem Code bin ich ein Tab-Fragment implementieren und im Hinzufügen der ViewPager-Code im Fragment und ich rufe das Fragment aus der Aktivität .. und es funktioniert gut, aber ich muss das zweite fragment manchmal öffnen, also wie kann ich das zweite fragment aus der aktivität laden. Hier ist mein Code:Öffnen Sie das zweite Fragment eines TabFragment aus der Aktivität

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


    } 

Anruf von der Aktivität:

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

        fragobjTab.navigateFragment(); 

Logs:

on a null object reference and than crash 

Antwort

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

Nun wird das zweite Fragment geöffnet werden würde.

+0

und wie kann ich diese Funktion von der Aktivität rufen – techDigi

+0

Sie einen Wert Fragment senden kann aus Aktivität und dann, wenn Sie Viewpager von Fragment einrichten, können Sie die oben genannten Zeilen aufrufen. –

0

Um ein neues Fragment in der aktuellen Aktivität zeigen Sie eine FragmentTransaction verwenden können:

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

FragmentTransaction transaction = 
getSupportFragmentManager().beginTransaction(); 

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

Als in der Antwort erwähnt Abhishek Dubey, viewPager.setCurrentItem() Methode verwenden.

Verwendung dieser 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(); 

im Fragment diesen Code hinzufügen, in Ihrem onCreateView:

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