xml:
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.zhixun.extraterrestrial.ui.MainActivity"> <FrameLayout android:id="@+id/lay_container" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="52dp" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> <android.support.design.widget.BottomNavigationView android:id="@+id/navigation" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginEnd="0dp" android:layout_marginStart="0dp" android:background="?android:attr/colorPrimaryDark" app:itemIconTint="@color/c_state_nav" app:itemTextColor="@color/c_state_nav" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:menu="@menu/navigation" /> </android.support.constraint.ConstraintLayout>
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/navigation_money" android:icon="@drawable/ic_launcher_foreground" android:title="@string/money" /> <item android:id="@+id/navigation_me" android:icon="@drawable/ic_launcher_foreground" android:title="@string/me" /> </menu>
HavHelper.java
public class NavHelper<T> { private final SparseArray<Tab<T>> tabs = new SparseArray<>(); private final Context mContext; private final int containerId; private final FragmentManager fragmentManager; private final OnTabChangeListener<T> mListener; private Tab<T> currentTab; public NavHelper(Context mContext, int containerId, FragmentManager fragmentManager, OnTabChangeListener<T> mListener) { this.mContext = mContext; this.containerId = containerId; this.fragmentManager = fragmentManager; this.mListener = mListener; } /** * 添加tab */ public NavHelper<T> add(int menuId, Tab<T> tab) { tabs.put(menuId, tab); return this; } /** * 获取当前Tab */ public Tab<T> getCurrentTab() { return currentTab; } /** * 执行点击菜单的操作 */ public boolean performClickMenu(int menuId) { Tab<T> tab = tabs.get(menuId); if (tab != null) { doSelect(tab); return true; } return false; } /** * 进行tab的选择操作 */ private void doSelect(Tab<T> tab) { Tab<T> oldTab = null; if (currentTab != null) { oldTab = currentTab; if (oldTab == tab) { //如果当前tab点击的tab,不做任何操作或者刷新 notifyReselect(tab); return; } } currentTab = tab; doTabChanged(currentTab, oldTab); } /** * Tab切换方法 */ private void doTabChanged(Tab<T> newTab, Tab<T> oldTab) { FragmentTransaction ft = fragmentManager.beginTransaction(); if (oldTab != null) { if (oldTab.fragment != null) { //从界面移除,但在Fragment的缓存中 ft.detach(oldTab.fragment); } } if (newTab != null) { if (newTab.fragment == null) { //首次新建并缓存 Fragment fragment = Fragment.instantiate(mContext, newTab.clx.getName(), null); newTab.fragment = fragment; ft.add(containerId, fragment, newTab.clx.getName()); } else { ft.attach(newTab.fragment); } } ft.commit(); notifySelect(newTab, oldTab); } /** * 选择通知回调 */ private void notifySelect(Tab<T> newTab, Tab<T> oldTab) { if (mListener != null) { mListener.onTabChange(newTab, oldTab); } } private void notifyReselect(Tab<T> tab) { //TODO 刷新 } public static class Tab<T> { public Tab(Class<?> clx, T extra) { this.clx = clx; this.extra = extra; } Class<?> clx; public T extra; //内部缓存对应的Fragment private Fragment fragment; } /** * 事件处理回调接口 */ public interface OnTabChangeListener<T> { void onTabChange(Tab<T> newTab, Tab<T> oldTab); } }
MainActivity:
public class MainActivity extends AppCompatActivity implements NavHelper.OnTabChangeListener { private NavHelper mNavHelper; private BottomNavigationView.OnNavigationItemSelectedListener mListener = item -> { switch (item.getItemId()) { case R.id.navigation_money: ToastUtils.showLong(R.string.money); mNavHelper.performClickMenu(1); return true; case R.id.navigation_me: ToastUtils.showLong(R.string.me); return true; } return false; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); BottomNavigationView navigation = findViewById(R.id.navigation); mNavHelper = new NavHelper<NavHelper>(this, R.id.lay_container, getSupportFragmentManager(), this); mNavHelper.add(1, new NavHelper.Tab<>(FundFragment.class, R.string.money)) .add(2, new NavHelper.Tab<>(MeFragment.class, R.string.me)); navigation.setOnNavigationItemSelectedListener(item -> { switch (item.getItemId()) { case R.id.navigation_money: mNavHelper.performClickMenu(1); return true; case R.id.navigation_me: mNavHelper.performClickMenu(2); return true; } return false; }); navigation.setOnNavigationItemSelectedListener(mListener); navigation.getMenu().getItem(0).setChecked(true); } @Override public void onTabChange(NavHelper.Tab newTab, NavHelper.Tab oldTab) { setTitle((Integer) newTab.extra); } }
public class FundFragment extends Fragment { @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.f_funds, container, false); } }
public class MeFragment extends Fragment { @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.f_me, container, false); } }
需要使用炫酷动画选:BottomNavigationView
不需要炫酷动画选:Tablayout