4

私は3つのタブ(ホーム、ダッシュボード、通知)で下部のナビゲーションを持っています。下の各ナビゲーションタブは断片です。最初のタブie。ホームフラグメントには、4つのタブ(タブ1、タブ2、タブ3、タブ4)を有する別のトップナビゲーションタブが含まれています。下部のナビゲーションフラグメント内にタブの断片

enter image description here

問題

  1. 私が直接通知タブにホームタブから移動し、これまでのタブが以前に選択ホームタブ、Tab1を/に戻ってきますタブ(上部のナビゲーションタブ)では、タブの内容が読み込まれません。

  2. 私はタブから1(ホームフラグメント]タブを)タブをスワイプ通知タブにすべての方法とタブの内容がと上にロードされていない4タブに到達すると、バックスワイプ最初のスワイプからタブ4タブ3スワイプはタブ3にはかからない。タブインジケータがちょっと動いて、2回目のスワイプでタブ3に移動します。

アプリにはたくさんのコードが含まれていますので、完全なコードをGithubにリンクします。クイックリファレンスについては

はここ

MainActivity.java

public class MainActivity extends AppCompatActivity { 


    private ViewPager viewPager; 

    NavigationView navigationView; 

    private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener 
      = new BottomNavigationView.OnNavigationItemSelectedListener() { 

     @Override 
     public boolean onNavigationItemSelected(@NonNull MenuItem item) { 
      switch (item.getItemId()) { 
       case R.id.navigation_home: 
        viewPager.setCurrentItem(0); 
        return true; 
       case R.id.navigation_dashboard: 
        viewPager.setCurrentItem(1); 
        return true; 
       case R.id.navigation_notifications: 
        viewPager.setCurrentItem(2); 
        return true; 
      } 
      return false; 
     } 

    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // Hide the activity toolbar 
     getSupportActionBar().hide(); 

     //Initializing viewPager 
     viewPager = (ViewPager) findViewById(R.id.viewpager); 
     setupViewPager(viewPager); 


     final BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation); 
     navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener); 

     viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
      @Override 
      public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

      } 

      @Override 
      public void onPageSelected(int position) { 
       switch (position){ 
        case 0: 
         navigation.setSelectedItemId(R.id.navigation_home); 
         break; 
        case 1: 
         navigation.setSelectedItemId(R.id.navigation_dashboard); 
         break; 
        case 2: 
         navigation.setSelectedItemId(R.id.navigation_notifications); 
         break; 
       } 
      } 

      @Override 
      public void onPageScrollStateChanged(int state) { 

      } 
     }); 


    } 

    private void setupViewPager(ViewPager viewPager) { 
     BottomNavPagerAdapter adapter = new BottomNavPagerAdapter(getSupportFragmentManager()); 
     adapter.addFragment(new FirstFragment()); 
     adapter.addFragment(new SecondFragment()); 
     adapter.addFragment(new ThirdFragment()); 
     viewPager.setAdapter(adapter); 
    } 

} 

FirstFragment.java(ホーム)

public class FirstFragment extends Fragment { 


    private TabLayout tabLayout; 
    private ViewPager firstViewPager; 

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


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 

     View rootView = inflater.inflate(R.layout.fragment_first, container, false); 

     firstViewPager = (ViewPager) rootView.findViewById(R.id.viewpager_content); 

     tabLayout = (TabLayout) rootView.findViewById(R.id.tabs); 
     tabLayout.setupWithViewPager(firstViewPager); 

     setupViewPager(firstViewPager); 
     return rootView; 
    } 

    private void setupViewPager(ViewPager viewPager) { 
     TabViewPagerAdapter adapter = new TabViewPagerAdapter(getActivity().getSupportFragmentManager()); 
     adapter.addFragment(new Tab1Fragment(), "Tab 1"); 
     adapter.addFragment(new Tab1Fragment(), "Tab 2"); 
     adapter.addFragment(new Tab1Fragment(), "Tab 3"); 
     adapter.addFragment(new Tab1Fragment(), "Tab 4"); 
     viewPager.setAdapter(adapter); 
    } 
} 

質問私のコードです

  1. 私は間違っていますか?
  2. どうすればこの問題を解決できますか? (レイアウトが要件です)、またはスクリーンショットからレイアウトを考え出すためのより良いアプローチがありますか?

答えて

13

実際には、一般的な間違いです - あなたは、フラグメント内のあなたのActivityFragmentManagerを使用しているが、このフラグメントは、あなたがフラグメント自体のFragmentManagerを使用する必要が別の断片が含まれているため。

private void setupViewPager(ViewPager viewPager) { 
    TabViewPagerAdapter adapter = new TabViewPagerAdapter(getChildFragmentManager()); 
    ... 
    ... 
    viewPager.setAdapter(adapter); 
} 

をそして予想通り、この作業をする必要があります:あなたは自分の断片内getChildFragmentManager()getActivity().getSupportFragmentManager()を変更する必要があり、そのコードは次のようになります - ので、修正は簡単です。

+0

ありがとうございます。 – Puni

+0

これはボトムナビゲーションライブラリでもうまくいきました –