没效果图说个屁:
工具类
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
有什么不对的请指教~结束~告辞~