Kotlin项目:如何让Toolbar菜单项水平均匀分布?
解决Toolbar菜单项水平均匀分布的问题
问题说明
即使将Toolbar标题设为空,菜单项仍默认靠右排列,要实现无标题且菜单项水平均匀分布,无法依赖默认的Menu机制,需要自定义Toolbar布局。
解决方案步骤
- 创建自定义Toolbar布局
新建layout/toolbar_custom.xml,用横向LinearLayout作为容器,给每个菜单项对应的控件设置layout_weight="1",让它们均分Toolbar宽度:
<?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="wrap_content" android:background="@color/bootRed" android:orientation="horizontal" android:weightSum="4" android:paddingHorizontal="8dp"> <ImageView android:id="@+id/btn_hunts" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:src="@drawable/baseline_catching_pokemon_24_black" android:scaleType="centerInside" android:padding="8dp" android:contentDescription="@string/hunts"/> <LinearLayout android:id="@+id/btn_add_hunt" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="vertical" android:gravity="center" android:padding="8dp"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_baseline_fiber_new_24" android:contentDescription="@string/new_hunt"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/new_hunt" android:textColor="@android:color/white"/> </LinearLayout> <ImageView android:id="@+id/btn_history" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:src="@drawable/ic_baseline_history_24" android:scaleType="centerInside" android:padding="8dp" android:contentDescription="@string/history"/> <ImageView android:id="@+id/btn_settings" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:src="@drawable/ic_baseline_settings_applications_24" android:scaleType="centerInside" android:padding="8dp" android:contentDescription="Settings"/> </LinearLayout>
- 修改Activity布局中的Toolbar引用
替换原来的Toolbar为这个自定义布局,同时修正原Toolbar的约束(原约束app:layout_constraintBottom_toBottomOf="parent"会把Toolbar放在底部,改为顶部约束):
<?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=".HuntsActivity"> <!-- 自定义Toolbar --> <include android:id="@+id/custom_toolbar" layout="@layout/toolbar_custom" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent"/> </androidx.constraintlayout.widget.ConstraintLayout>
- 在Activity中绑定控件并设置点击事件
不再使用setSupportActionBar和onCreateOptionsMenu,直接绑定自定义Toolbar的控件并处理点击:
class HuntsActivity : AppCompatActivity() { private lateinit var binding: HuntsActivityBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = HuntsActivityBinding.inflate(layoutInflater) setContentView(binding.root) // 设置各个按钮的点击事件 binding.btnHunts.setOnClickListener { // 处理查看狩猎记录的逻辑 } binding.btnAddHunt.setOnClickListener { // 处理添加新狩猎的逻辑 } binding.btnHistory.setOnClickListener { // 处理查看历史的逻辑 } binding.btnSettings.setOnClickListener { // 处理查看设置的逻辑 } } }
补充说明
- 如果需要保留Toolbar的系统特性(比如返回键),可以在自定义布局里嵌套原生Toolbar,再在内部放置均匀分布的控件。
- 原代码中Toolbar的约束存在错误,已修正为顶部对齐,确保Toolbar显示在屏幕顶部。
内容的提问来源于stack exchange,提问作者Dragamaroon
相关产品推荐
相关产品推荐

