Custom BottomBar + TabLayout + ViewPager
开发工具:Android Studio3.3.1, compileSdkVersion=28.0.0 ,gradle=gradle-4.10.1-all.zip
时间:2019/3/1
编程语言:Kotlin
功能:底部点击切换,子页滑动或者点击切换
测试手机:华为荣耀8,Android version 8.0.0(Oreo), API=26
简述:点击底部的切换页面,第二页的头部点击和滑动均可切换页面。
个人吐槽:其中的名字出自2019年1月6日开播的日剧《3年A班-从此刻起,大家都是我的人质》
GitHub: https://github.com/SAKURA96/RotationTest
GO:
1 build.gradle(Module:app)/dependencies添加依赖
implementation ‘com.android.support:design:28.0.0’
2 app/res中新建color文件夹,在color文件夹中新建bottom_text_selector.xml,底部导航栏字的颜色选择器
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!--选中时的颜色-->
<item android:color="#000000" android:state_enabled="false"/>
<!--未选中时的颜色-->
<item android:color="#A9A9A9" android:state_enabled="true"/>
</selector>
3 任意选择十张底部图片,我选择的图片为 material-design-icons-1.0.0\social\drawable-hdpi中的图片
4 底部导航栏图片选择器,在res/drawable中新建五个xml
bottom_pic_selectot_a.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!--选中时-->
<item android:drawable="@drawable/ic_group_black_48dp" android:state_enabled="false" />
<!--未选中时-->
<item android:drawable="@drawable/ic_group_grey600_48dp" android:state_enabled="true" />
</selector>
bottom_pic_selectot_b.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!--选中时-->
<item android:drawable="@drawable/ic_mood_black_48dp" android:state_enabled="false" />
<!--未选中时-->
<item android:drawable="@drawable/ic_mood_grey600_48dp" android:state_enabled="true" />
</selector>
bottom_pic_selectot_c.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!--选中时-->
<item android:drawable="@drawable/ic_notifications_black_48dp" android:state_enabled="false" />
<!--未选中时-->
<item android:drawable="@drawable/ic_notifications_grey600_48dp" android:state_enabled="true" />
</selector>
bottom_pic_selectot_d.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!--选中时-->
<item android:drawable="@drawable/ic_public_black_48dp" android:state_enabled="false" />
<!--未选中时-->
<item android:drawable="@drawable/ic_public_grey600_48dp" android:state_enabled="true" />
</selector>
bottom_pic_selectot_e.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!--选中时-->
<item android:drawable="@drawable/ic_school_black_48dp" android:state_enabled="false" />
<!--未选中时-->
<item android:drawable="@drawable/ic_school_grey600_48dp" android:state_enabled="true" />
</selector>
5 activity_main.xml
<?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" android:id="@+id/main"> <FrameLayout android:id="@+id/main_content" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"> </FrameLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="#808080"/> <LinearLayout android:id="@+id/bottom_bar" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="60dp" android:layout_weight="0"> <LinearLayout android:layout_width="0dp" android:layout_weight="1" android:layout_height="match_parent" android:orientation="vertical" android:padding="3dp"> <ImageView android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="5" android:src="@drawable/bottom_pic_selector_a"/> <TextView android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="2" android:layout_gravity="bottom" android:gravity="center_horizontal" android:textSize="12sp" android:textColor="@color/bottom_text_selector" android:text="柊一飒"/> </LinearLayout> <LinearLayout android:layout_width="0dp" android:layout_weight="1" android:layout_height="match_parent" android:orientation="vertical" android:padding="3dp"> <ImageView android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="5" android:src="@drawable/bottom_pic_selector_b"/> <TextView android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="2" android:layout_gravity="bottom" android:gravity="center_horizontal" android:textSize="12sp" android:textColor="@color/bottom_text_selector" android:text="甲斐隼人"/> </LinearLayout> <LinearLayout android:layout_width="0dp" android:layout_weight="1" android:layout_height="match_parent" android:orientation="vertical" android:padding="3dp"> <ImageView android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="5" android:src="@drawable/bottom_pic_selector_c"/> <TextView android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="2" android:layout_gravity="bottom" android:gravity="center_horizontal" android:textSize="12sp" android:textColor="@color/bottom_text_selector" android:text="宇佐美香帆"/> </LinearLayout> <LinearLayout android:layout_width="0dp" android:layout_weight="1" android:layout_height="match_parent" android:orientation="vertical" android:padding="3dp"> <ImageView android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="5" android:src="@drawable/bottom_pic_selector_d"/> <TextView android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="2" android:layout_gravity="bottom" android:gravity="center_horizontal" android:textSize="12sp" android:textColor="@color/bottom_text_selector" android:text="森崎瑞希"/> </LinearLayout> <LinearLayout android:layout_width="0dp" android:layout_weight="1" android:layout_height="match_parent" android:orientation="vertical" android:padding="3dp"> <ImageView android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="5" android:src="@drawable/bottom_pic_selector_e"/> <TextView android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="2" android:layout_gravity="bottom" android:gravity="center_horizontal" android:textSize="12sp" android:textColor="@color/bottom_text_selector" android:text="熊泽花恋"/> </LinearLayout> </LinearLayout> </LinearLayout>
6 两个Fragment的xml文件
fragment_a.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" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" android:textSize="24sp" android:text="填充页"/> </android.support.constraint.ConstraintLayout>
fragment_b.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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"> <android.support.design.widget.TabLayout android:id="@+id/tab_layout" android:layout_width="match_parent" android:layout_height="40dp" app:tabIndicatorColor="#000000" app:tabIndicatorHeight="2dp" app:tabSelectedTextColor="#000000" app:tabTextColor="#A9A9A9"> </android.support.design.widget.TabLayout> <android.support.v4.view.ViewPager android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v4.view.ViewPager> </LinearLayout>
7 两个Fragment的类
AFragment
import android.os.Bundle import android.support.v4.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup class AFragment:Fragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return View.inflate(activity,R.layout.fragment_a,null) } }
BFragment
import android.os.Bundle import android.support.v4.app.Fragment import android.support.v4.app.FragmentManager import android.support.v4.app.FragmentPagerAdapter import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import kotlinx.android.synthetic.main.fragment_b.* class BFragment : Fragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return View.inflate(activity, R.layout.fragment_b, null) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) view_pager.adapter = ViewPagerAdapter(childFragmentManager) tab_layout.setupWithViewPager(view_pager) } inner class ViewPagerAdapter(fragmentManager: FragmentManager) : FragmentPagerAdapter(fragmentManager) { private val fragments = listOf<Fragment>(AFragment(), AFragment()) private val titles = listOf("景山澪奈", "水越凉音") override fun getItem(position: Int): Fragment { return fragments[position] } override fun getCount(): Int { return titles.size } override fun getPageTitle(position: Int): CharSequence? { return titles[position] } } }
8 MainActivity
import android.support.v7.app.AppCompatActivity import android.os.Bundle import android.support.v4.app.Fragment import android.view.View import android.view.ViewGroup import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) bottomBar() //默认加载第一个fragment changeIndex(0) } private val fragments = listOf<Fragment>(AFragment(), BFragment(), AFragment(), AFragment(), AFragment()) private fun bottomBar() { for (i in 0 until bottom_bar.childCount) { bottom_bar.getChildAt(i).setOnClickListener { changeIndex(i) } } } private fun changeIndex(index: Int) { for (i in 0 until bottom_bar.childCount) { val view = bottom_bar.getChildAt(i) if (i == index) { //选中 禁用,此tab不可再被点击 setEnable(view, false) } else { //没选中 enable = true,监听点击 setEnable(view, true) } } supportFragmentManager.beginTransaction().replace(R.id.main_content, fragments[index]).commit() } private fun setEnable(view: View, isEnable: Boolean) { view.isEnabled = isEnable if (view is ViewGroup) { for (i in 0 until view.childCount) { view.getChildAt(i).isEnabled = isEnable } } } }

浙公网安备 33010602011771号