Skip to content

Instantly share code, notes, and snippets.

@SurajBahadur
Last active February 16, 2024 10:38
Show Gist options
  • Save SurajBahadur/7a44d82bd5b57c3d53a5043696c55cf5 to your computer and use it in GitHub Desktop.
Save SurajBahadur/7a44d82bd5b57c3d53a5043696c55cf5 to your computer and use it in GitHub Desktop.
Custom bottom navigation view in kotlin
import android.annotation.SuppressLint
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.Menu
import android.view.View
import android.widget.ImageView
import android.widget.TextView
import androidx.activity.viewModels
import androidx.core.content.ContextCompat
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.viewModels
import androidx.navigation.NavController
import androidx.navigation.findNavController
import androidx.navigation.ui.onNavDestinationSelected
import androidx.navigation.ui.setupWithNavController
import com.google.android.material.bottomnavigation.BottomNavigationItemView
import com.google.android.material.bottomnavigation.BottomNavigationMenuView
import com.google.android.material.bottomnavigation.BottomNavigationView
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class DashboardActivity : CommonActivity() {
private lateinit var binding: ActivityDashboardBinding
var navController: NavController? = null
val viewModel: DashboardViewModel by viewModels()
private var bottomNavigationItem:ArrayList<Pair<MenuItemData,BottomNavigationItemView>> = arrayListOf()
@SuppressLint("RestrictedApi")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityDashboardBinding.inflate(layoutInflater)
setContentView(binding.root)
val navView: BottomNavigationView = binding.navView
navController = findNavController(R.id.nav_host_fragment_activity_dashboard)
navController?.let {
navView.setupWithNavController(it)
}
viewModel.menuItems.forEachIndexed { index, menuItem ->
val item = navView.menu.add(Menu.NONE, menuItem.destinationId, index, menuItem.label)
item.isChecked = index == 0
}
addViewsToBottomNavigationView(navView)
}
@SuppressLint("RestrictedApi")
fun addViewsToBottomNavigationView(navView: BottomNavigationView) {
val bottomNavigationMenuView: BottomNavigationMenuView =
navView.getChildAt(0) as BottomNavigationMenuView
navView.setOnItemSelectedListener { menuItem ->
setNavigationUpdateItem(menuItem.title.toString())
navController?.let {
menuItem.onNavDestinationSelected(it)
}
true
}
for ((i, data) in viewModel.menuItems.withIndex()) {
val view: View = bottomNavigationMenuView.getChildAt(i)
val layoutInflater = LayoutInflater.from(this)
val binding: BottomNavigationItemBinding = DataBindingUtil.inflate(
layoutInflater, R.layout.bottom_navigation_item, bottomNavigationMenuView, false
)
val itemView = view as BottomNavigationItemView
itemView.addView(binding.root)
updateNavigationItem(binding.root,data,data.isSelected)
bottomNavigationItem.add(Pair(data,itemView))
}
}
private fun setNavigationUpdateItem(label: String) {
Log.e("checkCallItem"," label : $label")
bottomNavigationItem.forEach {
if(it.first.label==label){
updateNavigationItem(it.second,it.first,true)
}else{
updateNavigationItem(it.second,it.first,false)
}
}
}
private fun updateNavigationItem(view:View, data:MenuItemData, isSelected:Boolean){
val tvItemText: TextView = view.findViewById(R.id.tvItemText)
val ivItem: ImageView = view.findViewById(R.id.ivItem)
tvItemText.text = data.label
if (isSelected) {
ivItem.setImageResource(data.selectedImage)
tvItemText.setTextColor(
ContextCompat.getColor(
this@DashboardActivity,
R.color.lightTextPrimary
)
)
} else {
tvItemText.setTextColor(
ContextCompat.getColor(
this@DashboardActivity,
R.color.switchColor
)
)
ivItem.setImageResource(data.unSelectImage)
}
}
override fun getLayoutResourceId(): Int {
return 0
}
}
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/navigation_home"
android:title="" />
<item
android:id="@+id/videoQbankFragment"
android:title="" />
<item
android:id="@+id/videoQbankFragment1"
android:title="" />
<item
android:id="@+id/testTabFragment"
android:title="" />
<item
android:id="@+id/meFragment2022"
android:title="" />
<item
android:id="@+id/testTabFragment1"
android:title="" />
<item
android:id="@+id/meFragment20222"
android:title="" />
<!-- <item-->
<!-- android:id="@+id/navigation_notifications"-->
<!-- android:icon="@drawable/ic_notifications_black_24dp"-->
<!-- android:title="@string/title_notifications" />-->
</menu>
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/nav_view"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@drawable/bg_corner_8dp_2023"
android:outlineSpotShadowColor="@color/transparent"
android:outlineAmbientShadowColor="@color/transparent"
app:itemHorizontalTranslationEnabled="false"
app:labelVisibilityMode="unlabeled"
app:itemActiveIndicatorStyle="@null"
app:itemBackground="@android:color/transparent"
style="@style/CustomBottomNavigationStyle"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"/>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment