没效果图说个屁:
工具类
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
有什么不对不关我事~略略略~告辞~