RadioGroup/BottomNavigationView+Fragment 简单实现底部导航栏的工具类

没效果图说个屁:

工具类

JAVA代码

public class FragmentTabUtils implements RadioGroup.OnCheckedChangeListener {
    private List<Fragment> fragments;
    private RadioGroup rgs;
    private FragmentManager fragmentManager;
    private int fragmentContentId;
    private int currentTab;
    private OnRgsExtraCheckedChangedListener onRgsExtraCheckedChangedListener;


    public FragmentTabUtils(FragmentManager fragmentManager, List<Fragment> fragments, int fragmentContentId,
                            RadioGroup rgs, OnRgsExtraCheckedChangedListener onRgsExtraCheckedChangedListener) {
        this(fragmentManager, fragments, fragmentContentId, rgs, 0, onRgsExtraCheckedChangedListener);
    }

    /**
     * @param fragmentManager
     * @param fragments
     * @param fragmentContentId fragment容器
     * @param rgs 按钮组
     * @param checkIndex 加载页面后默认选中的第几个fragment
     * @param onRgsExtraCheckedChangedListener
     */
    public FragmentTabUtils(FragmentManager fragmentManager, List<Fragment> fragments, int fragmentContentId,
                            RadioGroup rgs, int checkIndex, OnRgsExtraCheckedChangedListener onRgsExtraCheckedChangedListener) {
        this.fragments = fragments;
        this.rgs = rgs;
        this.fragmentManager = fragmentManager;
        this.fragmentContentId = fragmentContentId;
        this.onRgsExtraCheckedChangedListener = onRgsExtraCheckedChangedListener;
        if (checkIndex < fragments.size()) {
            fragmentManager.beginTransaction().add(fragmentContentId, fragments.get(checkIndex)).commit();
        } else {
            fragmentManager.beginTransaction().add(fragmentContentId, fragments.get(0)).commit();
        }
        rgs.setOnCheckedChangeListener(this);
        ((RadioButton) rgs.getChildAt(checkIndex)).setChecked(true);
    }

    @Override
    public void onCheckedChanged(RadioGroup radioGroup, int checkedId) {
        for (int i = 0; i < rgs.getChildCount(); i++) {
            if (rgs.getChildAt(i).getId() == checkedId) {
                Fragment fragment = fragments.get(i);
                FragmentTransaction ft = obtainFragmentTransaction(i);
                getCurrentFragment().onPause();
                getCurrentFragment().onStop();
                if (fragment.isAdded()) {
                    fragment.onStart();
                    fragment.onResume();
                } else {
                    ft.add(fragmentContentId, fragment);
                    ft.commit();
                }
                showTab(i);
                // 如果设置了切换tab额外功能功能接口
                if (null != onRgsExtraCheckedChangedListener) {
                    onRgsExtraCheckedChangedListener.OnRgsExtraCheckedChanged(radioGroup, checkedId, i);
                }
            }
        }
    }

    /**
     * 切换tab
     *
     */
    private void showTab(int idx) {
        for (int i = 0; i < fragments.size(); i++) {
            Fragment fragment = fragments.get(i);
            FragmentTransaction ft = obtainFragmentTransaction(idx);
            if (idx == i) {
                ft.show(fragment);
            } else {
                ft.hide(fragment);
            }
            ft.commit();
        }
        // 更新目标tab为当前tab
        currentTab = idx;
    }

    /**
     * 获取一个带动画的FragmentTransaction
     */
    private FragmentTransaction obtainFragmentTransaction(int index) {
        FragmentTransaction ft = fragmentManager.beginTransaction();
        // 设置切换动画
        // if (index > currentTab) {
        // ft.setCustomAnimations(R.anim.slide_left_in, R.anim.slide_left_out);
        // } else {
        // ft.setCustomAnimations(R.anim.slide_right_in,
        // R.anim.slide_right_out);
        // }
        return ft;
    }

    public int getCurrentTab() {
        return currentTab;
    }

    public Fragment getCurrentFragment() {
        return fragments.get(currentTab);
    }

    public OnRgsExtraCheckedChangedListener getOnRgsExtraCheckedChangedListener() {
        return onRgsExtraCheckedChangedListener;
    }

    public void setOnRgsExtraCheckedChangedListener(OnRgsExtraCheckedChangedListener onRgsExtraCheckedChangedListener) {
        this.onRgsExtraCheckedChangedListener = onRgsExtraCheckedChangedListener;
    }

    /**
     * 切换tab额外功能功能接口
     */
    public static interface OnRgsExtraCheckedChangedListener {
        public void OnRgsExtraCheckedChanged(RadioGroup radioGroup, int checkedId, int index);
    }
}

Kotlin代码

class FragmentTabUtil : RadioGroup.OnCheckedChangeListener {

    private  val fragmentManager: FragmentManager
    private  val fragmentList: MutableList<Fragment>
    private var fragmentContentId = 0
    private var radioGroup: RadioGroup
    private var onRgsExtraCheckedChangedListener: OnRgsExtraCheckedChangedListener? = null
    private var currentTab = 0

    constructor(fragmentManager: FragmentManager, fragmentList: MutableList<Fragment>, fragmentContentId: Int,
                radioGroup: RadioGroup, onRgsExtraCheckedChangedListener: OnRgsExtraCheckedChangedListener?) : this(fragmentManager, fragmentList, fragmentContentId, radioGroup, 0, onRgsExtraCheckedChangedListener)

    constructor(fragmentManager: FragmentManager, fragmentList: MutableList<Fragment>, fragmentContentId: Int,
                radioGroup: RadioGroup, fragmentCheckPosition: Int, onRgsExtraCheckedChangedListener: OnRgsExtraCheckedChangedListener?) {
        this.fragmentManager = fragmentManager
        this.fragmentList = fragmentList
        this.fragmentContentId = fragmentContentId
        this.radioGroup = radioGroup
        this.onRgsExtraCheckedChangedListener = onRgsExtraCheckedChangedListener
        if (fragmentCheckPosition < fragmentList.size) {
            fragmentManager.beginTransaction().add(fragmentContentId, fragmentList[fragmentCheckPosition]).commit()
        } else {
            fragmentManager.beginTransaction().add(fragmentContentId, fragmentList[0]).commit()
        }
        radioGroup.setOnCheckedChangeListener(this)
        (radioGroup.getChildAt(fragmentCheckPosition) as RadioButton).isChecked = true
    }

    override fun onCheckedChanged(group: RadioGroup?, checkedId: Int) {
        for (i in 0 until radioGroup.childCount) {
            if (radioGroup.getChildAt(i).id == checkedId) {
                val fragment = fragmentList[i]
                val ft = fragmentManager.beginTransaction()
                getCurrentFragment().onPause()
                getCurrentFragment().onStop()
                if (fragment.isAdded) {
                    fragment.onStart()
                    fragment.onResume()
                } else {
                    ft.add(fragmentContentId, fragment)
                    ft.commit()
                }
                showTab(i)
                onRgsExtraCheckedChangedListener?.OnRgsExtraCheckedChanged(radioGroup, checkedId, i)
            }
        }
    }

    //切换tab
    fun showTab(index: Int) {
        for (i in 0 until fragmentList.size) {
            val fragment = fragmentList[i]
            val ft = fragmentManager.beginTransaction()
            if (index == i) {
                ft.show(fragment)
            } else {
                ft.hide(fragment)
            }
            ft.commit()
        }
        currentTab = index
    }

    fun getCurrentFragment(): Fragment {
        return fragmentList[currentTab]
    }

    fun setOnRgsExtraCheckedChangedListener(onRgsExtraCheckedChangedListener: OnRgsExtraCheckedChangedListener) {
        this.onRgsExtraCheckedChangedListener = onRgsExtraCheckedChangedListener
    }

    interface OnRgsExtraCheckedChangedListener {
        fun OnRgsExtraCheckedChanged(radioGroup: RadioGroup, checkedId: Int, index: Int)
    }
}
class BottomNavigationViewFragmentTabUtil :  BottomNavigationView.OnNavigationItemSelectedListener{


    private  val fragmentManager: FragmentManager
    private  val fragmentList: MutableList<Fragment>
    //默认选中展示第一个fragment
    private var fragmentContentId = 0
    private var bnView: BottomNavigationView
    private var onRgsExtraCheckedChangedListener: OnRgsExtraCheckedChangedListener? = null
    private var currentTab = 0

    constructor(fragmentManager: FragmentManager, fragmentList: MutableList<Fragment>, fragmentContentId: Int,
                bnView: BottomNavigationView, onRgsExtraCheckedChangedListener: OnRgsExtraCheckedChangedListener?) : this(fragmentManager, fragmentList, fragmentContentId, bnView, 0, onRgsExtraCheckedChangedListener)

    constructor(fragmentManager: FragmentManager, fragmentList: MutableList<Fragment>, fragmentContentId: Int,
                bnView: BottomNavigationView, fragmentCheckPosition: Int, onRgsExtraCheckedChangedListener: OnRgsExtraCheckedChangedListener?) {
        this.fragmentManager = fragmentManager
        this.fragmentList = fragmentList
        this.fragmentContentId = fragmentContentId
        this.bnView = bnView
        this.onRgsExtraCheckedChangedListener = onRgsExtraCheckedChangedListener
        if (fragmentCheckPosition < fragmentList.size) {
            fragmentManager.beginTransaction().add(fragmentContentId, fragmentList[fragmentCheckPosition]).commit()
        } else {
            fragmentManager.beginTransaction().add(fragmentContentId, fragmentList[0]).commit()
        }
        bnView.setOnNavigationItemSelectedListener(this)
        (bnView.getChildAt(fragmentCheckPosition) as BottomNavigationMenuView).isSelected = true
    }

    override fun onNavigationItemSelected(p0: MenuItem): Boolean {
        for (i in 0 until bnView.menu.size()) {
            if (bnView.menu.getItem(i).itemId == p0.itemId) {
                val fragment = fragmentList[i]
                val ft = fragmentManager.beginTransaction()
                getCurrentFragment().onPause()
                getCurrentFragment().onStop()
                if (fragment.isAdded) {
                    fragment.onStart()
                    fragment.onResume()
                } else {
                    ft.add(fragmentContentId, fragment)
                    ft.commit()
                }
                showTab(i)
            }
        }
        return true
    }


    //切换tab
    fun showTab(index: Int) {
        for (i in 0 until fragmentList.size) {
            val fragment = fragmentList[i]
            val ft = fragmentManager.beginTransaction()
            if (index == i) {
                ft.show(fragment)
            } else {
                ft.hide(fragment)
            }
            ft.commit()
        }
        currentTab = index
    }

    fun getCurrentFragment(): Fragment {
        return fragmentList[currentTab]
    }

    fun setOnRgsExtraCheckedChangedListener(onRgsExtraCheckedChangedListener: OnRgsExtraCheckedChangedListener) {
        this.onRgsExtraCheckedChangedListener = onRgsExtraCheckedChangedListener
    }

    interface OnRgsExtraCheckedChangedListener {
        fun OnRgsExtraCheckedChanged(radioGroup: RadioGroup, checkedId: Int, index: Int)
    }
}

用法

布局代码 (默认选中第几个fragment的时候记得在RadioGroup控件上 android:checkedButton="@+id/rb_person"

选中对应的RadioButton的id 。如下:)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <FrameLayout
        android:id="@+id/fl_content"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:background="@color/white"
        android:minHeight="400dp"></FrameLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="0.5dp"
        android:background="@color/line" />

    <RadioGroup
        android:id="@+id/rg_tab"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="@color/white"
        android:checkedButton="@+id/rb_person"
        android:gravity="center"
        android:orientation="horizontal">

        <RadioButton
            android:id="@+id/rb_home"
            style="@style/home_tab_style"
            android:drawableTop="@drawable/rb_tab_home"
            android:text="@string/home" />

        <RadioButton
            android:id="@+id/rb_c2c"
            style="@style/home_tab_style"
            android:drawableTop="@drawable/rb_tab_c2c"
            android:text="C2C" />

        <RadioButton
            android:id="@+id/rb_market"
            style="@style/home_tab_style"
            android:drawableTop="@drawable/rb_tab_market"
            android:text="@string/market" />

        <RadioButton
            android:id="@+id/rb_information"
            style="@style/home_tab_style"
            android:drawableTop="@drawable/rb_tab_infor"
            android:text="@string/news" />

        <RadioButton
            android:id="@+id/rb_person"
            style="@style/home_tab_style"
            android:drawableTop="@drawable/rb_tab_person"
            android:text="@string/person" />

    </RadioGroup>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <FrameLayout
        android:id="@+id/fl_content"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1.0"
        android:background="@color/white" />

    <View
        android:layout_width="match_parent"
        android:layout_height="0.5dp"
        android:background="@color/line" />

    <android.support.design.widget.BottomNavigationView
        android:id="@+id/bottom_navigation"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/white"
        app:itemIconSize="22dp"
        app:itemIconTint="@drawable/home_bottom_tab_color"
        app:itemTextColor="@drawable/home_bottom_tab_color"
        app:menu="@menu/menu_bottom_navigation" />
</android.support.v7.widget.LinearLayoutCompat>


//menu_bottom_navigation
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_home"
        android:enabled="true"
        android:icon="@drawable/home_bottom_item_ic_home"
        android:title="首页"
        app:showAsAction="ifRoom" />

    <item
        android:id="@+id/action_c2c"
        android:enabled="true"
        android:icon="@drawable/home_bottom_item_ic_c2c"
        android:title="C2C"
        app:showAsAction="ifRoom" />

    <item
        android:id="@+id/action_markets"
        android:enabled="true"
        android:icon="@drawable/home_bottom_item_ic_markets"
        android:title="行情"
        app:showAsAction="ifRoom" />

    <item
        android:id="@+id/action_information"
        android:enabled="true"
        android:icon="@drawable/home_bottom_item_ic_information"
        android:title="资讯"
        app:showAsAction="ifRoom" />

    <item
        android:id="@+id/action_person"
        android:enabled="true"
        android:icon="@drawable/home_bottom_item_ic_person"
        android:title="个人"
        app:showAsAction="ifRoom" />
</menu>

JAVA代码:

 private void initFragment() {
        fragmentList = new ArrayList<>();
        fragmentList.add(HomeFragment.newInstance());
        fragmentList.add(C2CFragment.newInstance());
        fragmentList.add(MarketFragment.newInstance());
        fragmentList.add(InforFragment.newInstance());
        fragmentList.add(PersonFragment.newInstance());
        new FragmentTabUtils(getSupportFragmentManager(), fragmentList, R.id.fl_content, rgTab,4, this);
    }

已知问题:

好像不能在RadioGroup中添加其他控件 emmm

原作者文章

http://code.taobao.org/p/sz1504demo/diff/14/truk/xytg/src/main/java/com/qianfeng/zhangwei/xytg

有什么不对的请指教~结束~告辞~

猜你喜欢

转载自blog.csdn.net/qq_30837235/article/details/81353206