为选项菜单子项添加右边距
Add right margin to the options menu sub-items
目前,我的选项菜单与屏幕末尾对齐。我想给它一个边距,比如 android:layout_marginEnd = "20dp"
。我怎样才能做到这一点?
我的选项菜单:
<?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"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity">
<item
android:id="@+id/menu_items"
android:icon="@drawable/menu_icon"
app:showAsAction="always">
<menu>
<group android:id="@+id/item1">
<item
android:id="@+id/download"
android:icon="@drawable/download_icon"
android:title="Download"></item>
</group>
<group android:id="@+id/item2">
<item
android:id="@+id/invite"
android:icon="@drawable/invite_icon"
android:title="Invite"></item>
</group>
</menu>
</item>
</menu>
我的自定义工具栏:
<androidx.appcompat.widget.Toolbar
android:id="@+id/menu_toolbar"
app:popupTheme="@style/ThemeOverlay.MyTheme"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:layout_below="@id/greetText"> <!--assume it comes somewhere in the centre due to this-->
</androidx.appcompat.widget.Toolbar>
我的菜单项主题:
<style name="ThemeOverlay.MyTheme" parent="ThemeOverlay.AppCompat.Light">
<item name="android:textColor">@color/dimGray</item>
<item name="android:textSize">14sp</item>
<item name="android:layout_marginEnd">20dp</item> <!-- doesn't work-->
<item name="android:fontFamily">@font/quicksand_medium</item>
<item name="android:background">@drawable/options_menu_background</item>
</style>
这是我的问题的图片。它显示了菜单的末端和屏幕是如何对齐的。我想要这两者之间的 space/margin。
这是一个有趣的问题。我尝试了很多在互联网上找到的东西,但没有任何效果。我尝试将 actionOverflowMenuStyle
设置为 dropDownHorizontalOffset
属性,但这也不起作用。最后,我得到了一个 PopupMenu
,效果很好。这是实现。
使用单个项目缩短您的初始菜单,该项目将作为子菜单打开弹出菜单。
<?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/menu_items"
android:icon="@drawable/ic_close_swipe"
android:title="@string/app_name"
app:showAsAction="always" />
</menu>
然后在您的 /res/menu/
文件夹中创建另一个菜单,命名为 popup_menu.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/menu_items"
android:icon="@drawable/ic_close_swipe"
android:title="@string/app_name"
app:showAsAction="always" />
</menu>
现在在你的MainActivity
中,只需添加以下函数来处理菜单按钮和弹出菜单的点击动作。
public class MainActivity extends AppCompatActivity implements PopupMenu.OnMenuItemClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar myToolbar = findViewById(R.id.menu_toolbar);
setSupportActionBar(myToolbar);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_items:
showPopupMenu();
return true;
default:
return false;
}
}
public void showPopupMenu() {
PopupMenu popup = new PopupMenu(this, findViewById(R.id.menu_items));
popup.setOnMenuItemClickListener(this);
popup.inflate(R.menu.popup_menu);
popup.setGravity(Gravity.END);
Object menuHelper;
Class[] argTypes;
try {
Field fMenuHelper = PopupMenu.class.getDeclaredField("mPopup");
fMenuHelper.setAccessible(true);
menuHelper = fMenuHelper.get(popup);
argTypes = new Class[]{boolean.class};
menuHelper.getClass().getDeclaredMethod("setForceShowIcon", argTypes).invoke(menuHelper, true);
} catch (Exception e) {
e.printStackTrace();
}
popup.show();
}
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.invite:
Toast.makeText(this, "Invite", Toast.LENGTH_LONG).show();
return true;
case R.id.download:
Toast.makeText(this, "Download", Toast.LENGTH_LONG).show();
return true;
default:
return false;
}
}
}
我把工作代码放在这个Github Branch。您可能会考虑从该分支和 运行 应用程序进行克隆,以检查这是否满足您的期望。
希望对您有所帮助!
目前,我的选项菜单与屏幕末尾对齐。我想给它一个边距,比如 android:layout_marginEnd = "20dp"
。我怎样才能做到这一点?
我的选项菜单:
<?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"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity">
<item
android:id="@+id/menu_items"
android:icon="@drawable/menu_icon"
app:showAsAction="always">
<menu>
<group android:id="@+id/item1">
<item
android:id="@+id/download"
android:icon="@drawable/download_icon"
android:title="Download"></item>
</group>
<group android:id="@+id/item2">
<item
android:id="@+id/invite"
android:icon="@drawable/invite_icon"
android:title="Invite"></item>
</group>
</menu>
</item>
</menu>
我的自定义工具栏:
<androidx.appcompat.widget.Toolbar
android:id="@+id/menu_toolbar"
app:popupTheme="@style/ThemeOverlay.MyTheme"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:layout_below="@id/greetText"> <!--assume it comes somewhere in the centre due to this-->
</androidx.appcompat.widget.Toolbar>
我的菜单项主题:
<style name="ThemeOverlay.MyTheme" parent="ThemeOverlay.AppCompat.Light">
<item name="android:textColor">@color/dimGray</item>
<item name="android:textSize">14sp</item>
<item name="android:layout_marginEnd">20dp</item> <!-- doesn't work-->
<item name="android:fontFamily">@font/quicksand_medium</item>
<item name="android:background">@drawable/options_menu_background</item>
</style>
这是我的问题的图片。它显示了菜单的末端和屏幕是如何对齐的。我想要这两者之间的 space/margin。
这是一个有趣的问题。我尝试了很多在互联网上找到的东西,但没有任何效果。我尝试将 actionOverflowMenuStyle
设置为 dropDownHorizontalOffset
属性,但这也不起作用。最后,我得到了一个 PopupMenu
,效果很好。这是实现。
使用单个项目缩短您的初始菜单,该项目将作为子菜单打开弹出菜单。
<?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/menu_items"
android:icon="@drawable/ic_close_swipe"
android:title="@string/app_name"
app:showAsAction="always" />
</menu>
然后在您的 /res/menu/
文件夹中创建另一个菜单,命名为 popup_menu.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/menu_items"
android:icon="@drawable/ic_close_swipe"
android:title="@string/app_name"
app:showAsAction="always" />
</menu>
现在在你的MainActivity
中,只需添加以下函数来处理菜单按钮和弹出菜单的点击动作。
public class MainActivity extends AppCompatActivity implements PopupMenu.OnMenuItemClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar myToolbar = findViewById(R.id.menu_toolbar);
setSupportActionBar(myToolbar);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_items:
showPopupMenu();
return true;
default:
return false;
}
}
public void showPopupMenu() {
PopupMenu popup = new PopupMenu(this, findViewById(R.id.menu_items));
popup.setOnMenuItemClickListener(this);
popup.inflate(R.menu.popup_menu);
popup.setGravity(Gravity.END);
Object menuHelper;
Class[] argTypes;
try {
Field fMenuHelper = PopupMenu.class.getDeclaredField("mPopup");
fMenuHelper.setAccessible(true);
menuHelper = fMenuHelper.get(popup);
argTypes = new Class[]{boolean.class};
menuHelper.getClass().getDeclaredMethod("setForceShowIcon", argTypes).invoke(menuHelper, true);
} catch (Exception e) {
e.printStackTrace();
}
popup.show();
}
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.invite:
Toast.makeText(this, "Invite", Toast.LENGTH_LONG).show();
return true;
case R.id.download:
Toast.makeText(this, "Download", Toast.LENGTH_LONG).show();
return true;
default:
return false;
}
}
}
我把工作代码放在这个Github Branch。您可能会考虑从该分支和 运行 应用程序进行克隆,以检查这是否满足您的期望。
希望对您有所帮助!