如何使用这些代码为Android底部导航栏设置完全相同的高度



我正在为Android应用程序编写代码。布局是向上滚动视图片段,向下滚动底部导航栏。它显示菜单项很好,点击事件也很好,但根据片段中显示的内容数量,底部导航栏的高度略有变化。

解决这种现象的办法是什么?以下是相关代码:

主要活动.kt

package info.shutterpress.idols
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.ui.setupWithNavController
import androidx.databinding.DataBindingUtil.setContentView
import com.google.android.material.bottomnavigation.BottomNavigationView
import info.shutterpress.idols.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
lateinit var view: View
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView<ActivityMainBinding>(this, R.layout.activity_main)
val navHostFragment =
supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
val navController = navHostFragment.navController
val mBottomNavView = findViewById<BottomNavigationView>(R.id.bottom_navigation_view)
mBottomNavView.setupWithNavController(navController)
mBottomNavView.visibility = View.VISIBLE
view = mBottomNavView
val mBottomNavigationView = view as BottomNavigationView
mBottomNavigationView.setOnNavigationItemSelectedListener { mi ->
when (mi.itemId) {
R.id.home_dest -> {
navController.navigate(R.id.main_fragment)
}
R.id.list_dest -> {
navController.navigate(R.id.recyclerview_fragment)
}
R.id.quiz_dest -> {
}
}
true
}
}
}

主要碎片.kt

package info.shutterpress.idols
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import info.shutterpress.idols.databinding.FragmentMainBinding
class MainFragment : Fragment() {
lateinit var bind: FragmentMainBinding
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
bind = DataBindingUtil.inflate(inflater, R.layout.fragment_main, container, false)
return bind.root
}
}

ListFragment.kt

package info.shutterpress.idols
import android.content.res.TypedArray
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import androidx.navigation.findNavController
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.RecyclerView
import info.shutterpress.idols.databinding.FragmentRecyclerviewBinding
class ListFragment : Fragment() {
lateinit var bind: FragmentRecyclerviewBinding
var title: Array<String>? = null
var image: TypedArray? = null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
super.onCreateView(inflater, container, savedInstanceState)
bind = DataBindingUtil.inflate(inflater, R.layout.fragment_recyclerview, container, false)
title = resources.getStringArray(R.array.idols_title_array)
image = resources.obtainTypedArray(R.array.idols_list_image_array)
var adapter = IdolsListAdapter(image, title) {
position -> onListItemClick(position)
}
bind.idolsList.adapter = adapter
return bind.root
}
private fun onListItemClick(position: Int) {
val action = ListFragmentDirections.actionRecyclerviewFragmentToDetailFragment(position)
findNavController().navigate(action)
}
inner class ListHolder(
view: View,
private val onItemClicked: (position: Int) -> Unit
) : RecyclerView.ViewHolder(view), View.OnClickListener {
var titleTextView: TextView = view.findViewById(R.id.detail_item_title)
var imageView: ImageView = view.findViewById(R.id.detail_item_image)
init {
view.setOnClickListener(this)
}
override fun onClick(v: View) {
val position = adapterPosition
onItemClicked(position)
}
}
inner class IdolsListAdapter(
var image: TypedArray?,
var title: Array<String>?,
val onItemClicked: (position: Int) -> Unit) :
RecyclerView.Adapter<ListHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) : ListHolder {
val view = layoutInflater.inflate(R.layout.item_view, parent, false)
return ListHolder(view, onItemClicked)
}
override fun getItemCount() = title!!.size
override fun onBindViewHolder(holder: ListHolder, position: Int) {
var _image = image!!.getResourceId(position, -1)
var _title = title!![position]
holder.apply {
titleTextView.text = _title
imageView.setImageResource(_image)
}
}
}
}

DetailFragment.kt

package info.shutterpress.idols
import android.content.res.TypedArray
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.navArgs
import info.shutterpress.idols.databinding.FragmentDetailBinding
class DetailFragment : Fragment() {
lateinit var bind: FragmentDetailBinding
var title: Array<String>? = null
var image: TypedArray? = null
var description: Array<String>? = null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
bind = DataBindingUtil.inflate(inflater, R.layout.fragment_detail, container, false)
val args by navArgs<DetailFragmentArgs>()
var _position = args.positionDatum
title = resources.getStringArray(R.array.idols_title_array)
image = resources.obtainTypedArray(R.array.idols_list_image_array)
description = resources.getStringArray(R.array.idols_description_array)
bind.writingDetailTitle.text = title!![_position]
bind.writingDetailImage.setImageResource(image!!.getResourceId(_position, -1))
bind.writingDetailContent.text = description!![_position]
return bind.root
}
}

activity_main.xml

<layout 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">
<data/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/darkBeige"
android:layout_margin="0dp"
android:paddingBottom="0dp"
android:orientation="vertical"
tools:context="info.shutterpress.idols.MainActivity">
<androidx.fragment.app.FragmentContainerView
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
app:defaultNavHost="true"
app:navGraph="@navigation/nav_main" />
<com.google.android.material.bottomnavigation.BottomNavigationView
app:menu="@menu/menu_bottom_navigation"
android:id="@+id/bottom_navigation_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight=".1"
android:padding="10dp"
android:theme="@style/Theme.bottomNavApp"
app:backgroundTint="@color/beige"
app:background="@color/beige"
app:itemIconTint="@color/black"
app:itemTextColor="@color/black" />
</LinearLayout>
</layout>

fragment_detail.xml

<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
</data>
<LinearLayout
android:id="@+id/detail_outermost_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="0dp"
android:paddingBottom="0dp"
android:layout_margin="0dp"
android:background="@color/darkBeige"
android:gravity="start"
android:orientation="vertical">
<TextView
android:id="@+id/writing_detail_title"
android:padding="4dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:paddingTop="10dp"
android:gravity="center"
android:textSize="35sp"
android:textColor="#FFFFFF"
android:textStyle="bold"/>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/darkBeige"
android:paddingTop="0dp"
android:paddingBottom="0dp"
android:scrollbarSize="12dip" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="0dp"
android:paddingBottom="0dp"
android:layout_marginTop="20dp"
android:background="@color/darkBeige"
android:gravity="start"
android:orientation="vertical">
<ImageView
android:id="@+id/writing_detail_image"
android:layout_width="320dp"
android:layout_height="320dp"
android:layout_gravity="center"
android:layout_marginTop="20dp"
app:srcCompat="@drawable/idols1" />
<TextView
android:id="@+id/writing_detail_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/darkBeige"
android:layout_marginTop="20dp"
android:layout_marginBottom="25dp"
android:paddingTop="0dp"
android:padding="20dp"
android:gravity="start"
android:textSize="@dimen/text_size_main"
android:textColor="#de000000"
android:lineSpacingExtra="@dimen/line_spacing_main"/>
</LinearLayout>
</ScrollView>
</LinearLayout>
</layout>

fragment_main.xml

<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="0dp"
android:paddingBottom="0dp"
android:layout_margin="0dp"
android:background="@color/darkBeige"
android:gravity="start"
android:orientation="vertical">
<TextView
android:padding="4dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/app_name"
android:paddingTop="10dp"
android:gravity="center"
android:textSize="35sp"
android:textColor="#FFFFFF"
android:textStyle="bold"/>
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/darkBeige"
android:layout_margin="0dp"
android:paddingTop="0dp"
android:paddingBottom="0dp"
android:scrollbarSize="12dip" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="0dp"
android:paddingBottom="0dp"
android:layout_margin="0dp"
android:background="@color/darkBeige"
android:gravity="start"
android:orientation="vertical">
<TextView
android:id="@+id/welcome_message"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/darkBeige"
android:layout_margin="0dp"
android:paddingTop="0dp"
android:padding="20dp"
android:gravity="start"
android:textSize="@dimen/text_size_main"
android:lineSpacingExtra="@dimen/line_spacing_main"
android:text="@string/welcome_message"
android:textColor="#de000000" />
</LinearLayout>
</ScrollView>
</LinearLayout>
</layout>

fragment_recyclerview.xml

<?xml version="1.0" encoding="utf-8"?>
<layout 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">
<data>
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="35dp"
android:id="@+id/recyclerview_fragment">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/idols_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:context="info.shutterpress.idols.MainActivity"
tools:listitem="@layout/item_view"/>
</LinearLayout>
</layout>

我问过专家,他给了我合适的解决方案!这很管用!

首先,从activity_main.xml,

<androidx.fragment.app.FragmentContainerView
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="wrap_content" // this should be 0dp
android:layout_weight="1"
app:defaultNavHost="true"
app:navGraph="@navigation/nav_main" />
<com.google.android.material.bottomnavigation.BottomNavigationView
app:menu="@menu/menu_bottom_navigation"
android:id="@+id/bottom_navigation_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight=".1" // this should be deleted
android:padding="10dp"
android:theme="@style/Theme.bottomNavApp"
app:backgroundTint="@color/beige"
app:background="@color/beige"
app:itemIconTint="@color/black"
app:itemTextColor="@color/black" />

这很管用!这是布局XML问题,而不是Kotlin代码。

最新更新