FragmentTabUtils/BottomNavigationViewFragmentTabUtil+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);
    }
}
public class BottomNavigationViewFragmentTabUtil implements BottomNavigationView.OnNavigationItemSelectedListener {

    private FragmentManager fragmentManager;
    private List<Fragment> fragmentList;

    //默認選中展示第一個fragment
    private int fragmentContentId = 0;
    private BottomNavigationView bnView;
    private OnExtraCheckChangedListener onExtraCheckChangedListener;
    private int currentTab;

    public BottomNavigationViewFragmentTabUtil(FragmentManager fragmentManager, List<Fragment> fragmentList, int fragmentContentId,
                                               BottomNavigationView bnView, OnExtraCheckChangedListener onExtraCheckChangedListener) {
        this(fragmentManager, fragmentList, fragmentContentId, bnView, 0, onExtraCheckChangedListener);
    }

    public BottomNavigationViewFragmentTabUtil(FragmentManager fragmentManager, List<Fragment> fragmentList, int fragmentContentId,
                                               BottomNavigationView bnView, int fragmentCheckPosition, OnExtraCheckChangedListener onExtraCheckChangedListener) {
        this.fragmentManager = fragmentManager;
        this.fragmentList = fragmentList;
        this.fragmentContentId = fragmentContentId;
        this.bnView = bnView;
        this.onExtraCheckChangedListener = onExtraCheckChangedListener;
        if (fragmentCheckPosition < fragmentList.size()) {
            fragmentManager.beginTransaction().add(fragmentContentId, fragmentList.get(fragmentCheckPosition)).commit();
        } else {
            fragmentManager.beginTransaction().add(fragmentContentId, fragmentList.get(0)).commit();
        }
        bnView.setOnNavigationItemSelectedListener(this);
        bnView.getChildAt(fragmentCheckPosition).setSelected(true);
    }


    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
        for (int i = 0; i < bnView.getMenu().size(); i++) {
            if (bnView.getMenu().getItem(i).getItemId() == menuItem.getItemId()) {
                Fragment fragment = fragmentList.get(i);
                FragmentTransaction ft = fragmentManager.beginTransaction();
                getCurrentFragment().onPause();
                getCurrentFragment().onStop();
                if (fragment.isAdded()) {
                    fragment.onStart();
                    fragment.onResume();
                } else {
                    ft.add(fragmentContentId,fragment);
                    ft.commit();
                }
                showTab(i);
            }
        }
        if (onExtraCheckChangedListener!=null) {
            onExtraCheckChangedListener.onExtraCheckChanged(menuItem);
        }
        return true;
    }

    private Fragment getCurrentFragment() {
        return fragmentList.get(currentTab);
    }

    private void showTab(int index) {
        for (int i = 0;i<fragmentList.size();i++) {
            Fragment fragment = fragmentList.get(i);
            FragmentTransaction ft = fragmentManager.beginTransaction();
            if (index ==i) {
                ft.show(fragment);
            } else {
                ft.hide(fragment);
            }
            ft.commit();
        }
        currentTab = index;
    }


    public interface OnExtraCheckChangedListener {
        void onExtraCheckChanged(MenuItem menuItem);
    }
}

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 onExtraCheckedChangedListener: OnExtraCheckedChangedListener? = null
    private var currentTab = 0
    //是否響應點擊事件
    private var isCheckedChangedListener = false

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

    constructor(
        fragmentManager: FragmentManager,
        fragmentList: MutableList<Fragment>,
        fragmentContentId: Int,
        bnView: BottomNavigationView,
        fragmentCheckPosition: Int,
        onExtraCheckedChangedListener: OnExtraCheckedChangedListener?
    ) {
        this.fragmentManager = fragmentManager
        this.fragmentList = fragmentList
        this.fragmentContentId = fragmentContentId
        this.bnView = bnView
        this.onExtraCheckedChangedListener = onExtraCheckedChangedListener
        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 {
        isCheckedChangedListener = onExtraCheckedChangedListener?.onExtraCheckedChanged(p0) ?: true
        if (isCheckedChangedListener) {
            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 isCheckedChangedListener
    }


    //切換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 setOnExtraCheckedChangedListener(onExtraCheckedChangedListener: OnExtraCheckedChangedListener) {
        this.onExtraCheckedChangedListener = onExtraCheckedChangedListener
    }

    interface OnExtraCheckedChangedListener {
        /**
         * 返回值:是否響應點擊事件
         */
        fun onExtraCheckedChanged(menuItem: MenuItem): Boolean
    }
}

用法

佈局代碼 (默認選中第幾個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="@mipmap/ic_home_normal"
        android:title="首頁"
        app:showAsAction="ifRoom" />

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

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

    <item
        android:id="@+id/action_information"
        android:enabled="true"
        android:icon="@mipmap/ic_information_normal"
        android:title="資訊"
        app:showAsAction="ifRoom" />

    <item
        android:id="@+id/action_person"
        android:enabled="true"
        android:icon="@mipmap/ic_person_normal"
        android:title="個人"
        app:showAsAction="ifRoom" />
</menu>

//home_bottom_tab_color
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/mainColor"
    android:state_checked="true" />
<item android:color="@color/line" />

</selector>

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

以上工具類下載地址: https://download.csdn.net/download/qq_30837235/10784419

有什麼不對不關我事~略略略~告辭~

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章