BottomNavigationView

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值