Xamarin Android如何将Toolbar菜单图标对齐至右侧?
解决Xamarin Android Toolbar菜单图标右对齐的问题
你遇到的问题是因为SetHomeAsUpIndicator设置的是ActionBar的导航图标,这个位置在Android的设计规范里默认就是左侧的。要把菜单图标移到右侧,我们有两种常用的解决方案,推荐第一种更符合规范的实现方式:
方案一:使用Toolbar右侧菜单项(推荐)
这种方式利用Toolbar的右侧操作菜单区域来放置图标,完全符合Android的设计逻辑,步骤如下:
1. 创建菜单资源文件
在Resources/menu目录下创建一个新的菜单文件(比如menu_drawer.xml),内容如下:
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/action_drawer" android:icon="@drawable/menu_icon" android:title="Menu" app:showAsAction="always"/> <!-- always表示始终显示图标在Toolbar上 --> </menu>
2. 修改MainActivity代码
移除原来的SetHomeAsUpEnabled、SetHomeButtonEnabled、SetHomeAsUpIndicator相关代码,改为加载右侧菜单并处理点击:
protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); SetContentView(Resource.Layout.menu); V7Toolbar toolbar = FindViewById<V7Toolbar>(Resource.Id.toolbar); SetSupportActionBar(toolbar); // 移除原来的Home导航图标相关设置 SupportActionBar.SetDisplayShowTitleEnabled(true); drawerLayout = FindViewById<DrawerLayout>(Resource.Id.drawer_layout); navigationView = FindViewById<NavigationView>(Resource.Id.nav_view); } // 加载右侧菜单 public override bool OnCreateOptionsMenu(IMenu menu) { MenuInflater.Inflate(Resource.Menu.menu_drawer, menu); return base.OnCreateOptionsMenu(menu); } public override bool OnOptionsItemSelected(IMenuItem item) { switch (item.ItemId) { case Resource.Id.action_drawer: drawerLayout.OpenDrawer(Android.Support.V4.View.GravityCompat.End); return true; } return base.OnOptionsItemSelected(item); }
3. 保留原menu.axml布局
你的menu.axml布局不需要修改,因为Toolbar的布局已经是match_parent,右侧菜单会自动对齐到Toolbar右侧。
方案二:自定义Toolbar布局(适合特殊布局需求)
如果你一定要用自定义的位置放置图标,可以创建一个自定义Toolbar布局:
1. 创建自定义Toolbar布局(比如toolbar_custom.xml)
<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="65.5dp" android:background="#ff356f4d" android:fitsSystemWindows="true"> <!-- Toolbar标题 --> <TextView android:id="@+id/toolbar_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Overview - House 1" android:textColor="#ffffff" android:textSize="18sp" android:layout_gravity="center"/> <!-- 右侧菜单图标 --> <ImageView android:id="@+id/drawer_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/menu_icon" android:layout_gravity="end" <!-- 对齐到右侧 --> android:padding="16dp"/> </android.support.v7.widget.Toolbar>
2. 修改menu.axml布局
替换原来的Toolbar为自定义布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical" android:layout_width="match_parent" android:fitsSystemWindows="true" android:layout_height="match_parent"> <!-- 引用自定义Toolbar --> <include layout="@layout/toolbar_custom"/> <android.support.v4.widget.DrawerLayout android:id="@+id/drawer_layout" android:layout_height="match_parent" android:fitsSystemWindows="true" android:layout_width="match_parent" > <RelativeLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" /> <android.support.design.widget.NavigationView android:id="@+id/nav_view" android:layout_height="match_parent" android:layout_width="200dp" android:layout_gravity="right" android:fitsSystemWindows="true" app:menu="@menu/menu" /> </android.support.v4.widget.DrawerLayout> </LinearLayout>
3. 修改MainActivity代码
给自定义Toolbar的图标设置点击事件:
protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); SetContentView(Resource.Layout.menu); V7Toolbar toolbar = FindViewById<V7Toolbar>(Resource.Id.toolbar); SetSupportActionBar(toolbar); // 隐藏默认标题,用自定义的标题 SupportActionBar.SetDisplayShowTitleEnabled(false); drawerLayout = FindViewById<DrawerLayout>(Resource.Id.drawer_layout); navigationView = FindViewById<NavigationView>(Resource.Id.nav_view); // 设置右侧图标点击事件 ImageView drawerIcon = FindViewById<ImageView>(Resource.Id.drawer_icon); drawerIcon.Click += (s, e) => { drawerLayout.OpenDrawer(Android.Support.V4.View.GravityCompat.End); }; } // 不需要OnCreateOptionsMenu和原来的OnOptionsItemSelected处理(除非还有其他菜单项)
两种方案都能实现你要的图标右对齐效果,方案一更符合Android的设计规范,推荐使用。
内容的提问来源于stack exchange,提问作者Mike Irish
相关产品推荐
相关产品推荐

