I am working on a News App with fragments.
the main error I'm getting is
"java.lang.RuntimeException: Unable to start activity ComponentInfo{com.diparoy.newsexplorer/com.diparoy.newsexplorer.ui.NewsActivity}: android.view.InflateException: Binary XML file line #25: Binary XML file line #25: Error inflating class fragment"
THIS IS MY BREAKING NEWS FRAGMENT
class BreakingNewsFragment : Fragment(R.layout.fragment_breaking_news) {
private lateinit var binding: FragmentBreakingNewsBinding
private lateinit var viewModel: NewsViewModel
private lateinit var newsAdapter: NewsAdapter
private val TAG = "BreakingNewsFragment"
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentBreakingNewsBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel = (activity as NewsActivity).viewModel
setUpRecyclerView()
viewModel.breakingNews.observe(viewLifecycleOwner, Observer { response ->
when (response) {
is Resource.Success -> {
hideProgressBar()
response.data?.let { newsResponse ->
newsAdapter.differ.submitList(newsResponse.articles)
}
}
is Resource.Error -> {
hideProgressBar()
response.message?.let { message ->
Log.e(TAG, "An error occurred: $message")
}
}
is Resource.Loading -> {
showProgressBar()
}
}
})
}
private fun hideProgressBar() {
binding.paginationProgressBar.visibility = View.INVISIBLE
}
private fun showProgressBar() {
binding.paginationProgressBar.visibility = View.VISIBLE
}
private fun setUpRecyclerView() {
newsAdapter = NewsAdapter()
binding.rvBreakingNews.apply {
adapter = newsAdapter
layoutManager = LinearLayoutManager(activity)
}
}
}
THERE ARE 3 FRAGMENTS NAMELY BREKING NEWS, SEARCH NEWS AND SAVED NEWS
THIS IS MY NEWS ACTIVITY, where all the fragments will be displayed through bottom navigation menu through the bottom navigation controller
class NewsActivity : AppCompatActivity() {
lateinit var viewModel: NewsViewModel
private lateinit var binding: ActivityNewsBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityNewsBinding.inflate(layoutInflater)
setContentView(binding.root)
// Initialize ViewModel and Repository
val newsRepository = NewsRepository(ArticleDatabase(this))
val viewModelProviderFactory = NewsViewModelProviderFactory(newsRepository)
viewModel = ViewModelProvider(this, viewModelProviderFactory).get(NewsViewModel::class.java)
// Set up bottom navigation with NavController
val bottomNavigationView = binding.bottomNavigationView
val newsNavHostFragment =
supportFragmentManager.findFragmentById(R.id.newsNavHostFragment) as NavHostFragment
bottomNavigationView.setupWithNavController(newsNavHostFragment.navController)
}
}
THIS IS ACTIVITYNEWS.XML
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.NewsActivity">
<FrameLayout
android:id="@+id/flFragment"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@+id/bottomNavigationView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<fragment
android:id="@+id/newsNavHostFragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/news_nav_graph"/>
</FrameLayout>
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottomNavigationView"
android:layout_width="match_parent"
android:layout_height="56dp"
app:menu="@menu/bottom_nav_menu"
android:background="@color/tropical_indigo"
app:itemIconTint="@drawable/icon_color_selector"
app:itemTextColor="#2B2D32"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
And the fragment_breakingnews has a recycler view in it
Please help me solving this error.
I tried using viewBinding(). And also implemented some dependencies in the build.gradle. But nothing helped.