2016-05-12 7 views
0

私はBottomBarでアンドロイドの新しいデザインパターンを実装しようとしています。私はそのためのライブラリを使用しています。下部バーに断片を残しておいてください

私はフラグメントを生かしておくことができますか(ViewPagerのようなのでしょうか?)ユーザーがタブを変更してすでに訪れたことがある場合、フラグメントを再作成する必要はありませんか?

+0

フラグメントを一度作成して生き続けるのはどうでしょうか?あなたが特定の断片を必要とするとき - あなたはそれをあなたの「保存保管」から取り出し、前の断片を置き換えますか? –

答えて

0

これは私がやったことです。完璧ではなく、さらに改善することができます。私は何が何をしているのかに関するコメントを入れました。

public class MainHolderFragment extends BaseFragment { 

    private static final String ARG_PARAM1 = "param1"; 

    FragmentMainHolderBinding mBinder; 
    FragmentManager mFragmentManager; 
    Fragment mFragment; 
    Fragment homeFragment = HomeFragment.newInstance(); 
    Fragment searchFragment = SearchFragment.newInstance(); 
    Fragment addFragment = AddFragment.newInstance(); 
    Fragment activityFragment = ActivityFragment.newInstance(); 
    Fragment profileFragment = ProfileFragment.newInstance(); 

    public MainHolderFragment() { 

    } 

    public static MainHolderFragment newInstance() { 
     MainHolderFragment fragment = new MainHolderFragment(); 
     Bundle args = new Bundle(); 
     fragment.setArguments(args); 
     return fragment; 
    } 

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

    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     mBinder = DataBindingUtil.inflate(inflater, R.layout.fragment_main_holder, container, false); 
     mFragmentManager = getChildFragmentManager(); 
     createFragments(); 
     adjustTabs(); 
     setUIListeners(); 
     return mBinder.getRoot(); 
    } 

    @Override 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
    } 

    @Override 
    public void onDestroyView() { 
     super.onDestroyView(); 
    } 

    private void setUIListeners() { 
     mBinder.bottomBar.setOnTabSelectListener(new OnTabSelectListener() { 
      @Override 
      public void onTabSelected(@IdRes int tabId) { 
       switch (tabId) { 
        case R.id.tab_home: 
         hideShowFragment(mFragment, homeFragment); 
         mFragment = homeFragment; 
         break; 
        case R.id.tab_search: 
         hideShowFragment(mFragment, searchFragment); 
         mFragment = searchFragment; 
         break; 
        case R.id.tab_add: 
         hideShowFragment(mFragment, addFragment); 
         mFragment = addFragment; 
         break; 
        case R.id.tab_activity: 
         hideShowFragment(mFragment, activityFragment); 
         mFragment = activityFragment; 
         break; 
        case R.id.tab_profile: 
         hideShowFragment(mFragment, profileFragment); 
         mFragment = profileFragment; 
         break; 
       } 
      } 
     }); 
    } 

    //Method to add and hide all of the fragments you need to. In my case I hide 4 fragments, while 1 is visible, that is the first one. 
    private void addHideFragment(Fragment fragment) { 
     mFragmentManager.beginTransaction().add(R.id.frame_container, fragment).hide(fragment).commit(); 
    } 

    //Method to hide and show the fragment you need. It is called in the BottomBar click listener. 
    private void hideShowFragment(Fragment hide, Fragment show) { 
     mFragmentManager.beginTransaction().hide(hide).show(show).commit(); 
    } 

    //Add all the fragments that need to be added and hidden. Also, add the one that is supposed to be the starting one, that one is not hidden. 
    private void createFragments() { 
     addHideFragment(searchFragment); 
     addHideFragment(addFragment); 
     addHideFragment(activityFragment); 
     addHideFragment(profileFragment); 
     mFragmentManager.beginTransaction().add(R.id.frame_container, homeFragment).commit(); 
     mFragment = homeFragment; 
    } 

    //I wanted to remove the titles and lower the icons a little bit. 
    private void adjustTabs() { 
     mBinder.bottomBar.getTabWithId(R.id.tab_home).setPadding(0, 30, 0, 0); 
     mBinder.bottomBar.getTabWithId(R.id.tab_search).setPadding(0, 30, 0, 0); 
     mBinder.bottomBar.getTabWithId(R.id.tab_add).setPadding(0, 30, 0, 0); 
     mBinder.bottomBar.getTabWithId(R.id.tab_activity).setPadding(0, 30, 0, 0); 
     mBinder.bottomBar.getTabWithId(R.id.tab_profile).setPadding(0, 30, 0, 0); 
    } 
} 
+0

ホームフラグメントにFragmentBを追加した場合は、[プロファイル]タブをクリックします。 FragmentB staysとProfileFragmentは表示されません。この問題がありましたか? – Chetna

+0

私は何の問題もありません。もっと説明してもらえますか? – jlively

関連する問題