5

こんにちは私はフラグメント内にTabLayoutとViewPagerを持っています。しかし、私は子供の断片に来るためにタブ間をスライドすることはできません(アクティビティでは正常に動作しますが、フラグメントでは動作しません)。ここでTabLayoutでViewPagerがフラグメント内で動作しないAndroid

がフラグメント内部Tablayoutための私のコードです:

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     View inflateView = inflater.inflate(R.layout.fragment_assign_beacon_to_event, container, false); 

     //Viewpager and TabLayout 
     viewPager = (ViewPager)inflateView.findViewById(R.id.viewPager); 
     viewPager.setAdapter(new CustomAdapter(getFragmentManager(), getContext())); 

     tabLayout = (TabLayout)inflateView.findViewById(R.id.tabLayout); 


     // Inflate the layout for this fragment 
     return inflateView; 
    } 

@Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

    tabLayout.post(new Runnable() { 
       @Override 
       public void run() { 
        tabLayout.setupWithViewPager(viewPager); 

      } 
     }); 

     tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
      @Override 
      public void onTabSelected(TabLayout.Tab tab) { 
       viewPager.setCurrentItem(tab.getPosition()); 
      } 

      @Override 
      public void onTabUnselected(TabLayout.Tab tab) { 
       viewPager.setCurrentItem(tab.getPosition()); 
      } 

      @Override 
      public void onTabReselected(TabLayout.Tab tab) { 
       viewPager.setCurrentItem(tab.getPosition()); 
      } 
     }); 

Any here is my Custom Adapter class 

private class CustomAdapter extends FragmentPagerAdapter { 

     private String fragments[] = {"Assign Event", "Manage Event"}; 

     public CustomAdapter(FragmentManager supportFragmentManager, Context applicationContext) { 
      super(supportFragmentManager); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      switch (position) { 
       case 0: 
//     return new AssignEventToBeacon(); 
        return new Test1(); 
       case 1: 
        return new ManageEventAssigned(); 
       default: 
        return null; 
      } 
     } 

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

     @Override 
     public CharSequence getPageTitle(int position) { 
      return fragments[position]; 
     } 

    } 

私は私がこの回線に問題があります疑う:

viewPager.setAdapter(new CustomAdapter(getFragmentManager(), getContext())); 

Anyhelpは感謝

+0

viewPager.setAdapterとして試してください(新しいCustomAdapter(getSupportFragmentManager()、getContext())); // getSupportFragmentManager()またはgetChildFragmentManager() –

+0

この質問を見ると、あなたが望むものがすべてあります。 http://stackoverflow.com/q/34015117/2404262 –

+0

あなたのお返事ありがとうございます。私は両方を試みたが、うまくいかなかった。とにかく、tablayoutとViewPagerを、アクティビティと同じようにフラグメント化するには? –

答えて

6

は、私が行っている、非常に感謝しています同様のプロジェクトです。フラグメントのコードは次のとおりです。

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View view = inflater.inflate(R.layout.outer_fragment, container, false); 
     setHasOptionsMenu(true); 

     ViewPager viewPager = (ViewPager) view.findViewById(R.id.viewpager); 
     if (viewPager != null) { 
      setupViewPager(viewPager); 
     } 

     Log.v("Layout","Tabs"); 
     TabLayout tabLayout = (TabLayout) view.findViewById(R.id.tabs); 
     tabLayout.setSelectedTabIndicatorColor(Color.parseColor("#FFFFFF")); 
     tabLayout.setTabTextColors(Color.parseColor("#707070"), Color.parseColor("#FFFFFF")); 
     assert viewPager != null; 
     tabLayout.setupWithViewPager(viewPager); 

     return view; 
    } 

private void setupViewPager(ViewPager viewPager) { 
     Adapter adapter = new Adapter(getChildFragmentManager()); 
     adapter.addFragment(new Tab1Fragment(), "PHOTOS"); 
     adapter.addFragment(new Tab2Fragment(), "HI-FIVES"); 
     viewPager.setAdapter(adapter); 
    } 


static class Adapter extends FragmentPagerAdapter { 
     private final List<Fragment> mFragments = new ArrayList<>(); 
     private final List<String> mFragmentTitles = new ArrayList<>(); 

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

     public void addFragment(Fragment fragment, String title) { 
      mFragments.add(fragment); 
      mFragmentTitles.add(title); 
     } 

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

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

     @Override 
     public CharSequence getPageTitle(int position) { 
      return mFragmentTitles.get(position); 
     } 
    } 
+0

ありがとうございました。解決策は、getchildFragmentManagerを使用することです。しかし、私はまだOnCreateViewの中にすべての実行可能コードを入れたり、OnActivityCreatedにいくつか移動する必要があるという1つの質問がありますか?ユーザーがそのフラグメントにスライドした場合にのみフラグメントを実行するようにしました[今、それらはすべて同時にフラグメントをロードします –

+0

'onCreateView()'でビューを拡張し、 'onCreateView() 'または' onActivityCreated() 'を呼び出します。 getActivity()を呼び出す前に 'if(isAdded())'を実行することを忘れないでください。 –

+0

まだgetContextとgetActivityの間に混乱があります。いずれかを使うのはいつですか?ユーザーがスライドするときにのみフラグメントの読み込みを行う例がありますか? –

関連する問題