如何在操作栏上添加自定义按钮?

6
我希望制作一个带有右侧按钮且具有margin_right的操作栏,就像这样 picture1 我使用了操作按钮来实现它。但是按钮在右侧没有margin_right。 picture2 android:layout_marginRight在此处不起作用。
这是我的styles.xml:
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
    <item name="android:actionBarSize">50dp</item>
    <item name="android:actionBarStyle">@style/my_actionbar_style</item>
    <item name="android:actionButtonStyle">@style/my_action_button</item>

</style>
<style name="my_actionbar_style" parent="android:Widget.ActionBar">
    <item name="android:background">@color/actionbar_backgroud</item>
    <item name="android:titleTextStyle">@style/myTitleStyle</item>
    <item name="android:displayOptions">showTitle</item>
</style>
<style name="myTitleStyle">
    <item name="android:textColor">#ffffff</item>
    <item name="android:textSize">20sp</item>
</style>

<style name="my_action_button">
    <item name="android:background">@drawable/button_selector</item>
    <item name="android:width">70dp</item>
    <item name="android:textSize">13sp</item>
    <item name="android:layout_marginTop">10dp</item>
    <item name="android:layout_marginBottom">10dp</item>
    <item name="android:layout_marginRight">10dp</item>
</style>

这是我的menu.xml文件:

<menu xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
tools:ignore="AppCompatResource">

<item
    android:id="@+id/action_search"
    android:title="submit"
    android:showAsAction="always" /></menu>

你可以使用自定义操作栏来实现在Android中带有自定义按钮的操作栏。https://dev59.com/imUp5IYBdhLWcg3wGEkR - arun
如果可能的话,请尝试使用工具栏。它非常简单易用。http://stackoverflow.com/questions/32084868/actionbar-will-not-align-correctly-relativelayout/32084988#32084988 - Geetha
2个回答

6

另一个快速而干净的方法是为菜单按钮指定自己的布局,例如:

<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="com.example.MainActivity">

    <item
        android:id="@+id/action_custom_button"
        android:title="Custom Button"
        android:icon="@drawable/ic_custom_button"
        app:actionLayout="@layout/layout_to_custom_button"
        app:showAsAction="always" />

</menu>

需要有一个

layout_to_custom_button.xml

布局文件,其中包含所需的填充和样式。

并且在您的活动中执行以下操作来处理单击事件

@Override
public boolean onCreateOptionsMenu(Menu menu) {
  getMenuInflater().inflate(R.menu.menu_product_detail, menu);
  final Menu mMenu = menu;
  final MenuItem item = menu.findItem(R.id.action_custom_button);
  item.getActionView().setOnClickListener(new View.OnClickListener(){

    @Override
    public void onClick(View v) {
      mMenu.performIdentifierAction(item.getItemId(), 0);
    }
   });
        return true;
}

太好了!非常感谢。但是我发现需要添加 "android:showAsAction="always"",否则操作按钮会隐藏在溢出菜单中。 - Yriuns
抱歉,我遇到了另一个问题。在我添加了“actionLayout”后,public boolean onOptionsItemSelected(MenuItem item)方法不起作用。尽管我点击了按钮,但该方法似乎没有被激活。 - Yriuns
我刚刚添加了一个方法,用于获取自定义菜单项的点击事件。谢谢。 - Kevin Constantine

1
我发现最简单的方法是在布局文件中创建自己的操作栏。然后,您可以让活动继承一个常见的活动,覆盖setContentView,在其中将给定的视图插入到包含该视图和操作栏的父视图中。您可以使用ActionMenuView(5.0+)模仿溢出菜单行为。例如,假设您有一个名为menuView的ActionMenuView的action_bar.xml:
class BaseActivity extends Activity {

    ...
    ActionMenuView mMenuView;
    ...

    @Override
    protected void setContentView(int resId) {
        LayoutInflater inflater = getLayoutInflater();
        View actionBar = inflater.inflate(R.layout.action_bar, null);
        View contentView = inflater.inflate(resId);

        mMenuView = (ActionMenuView)actionBar.findViewById(R.id.menuView);

        RelativeLayout parentLayout = new RelativeLayout(this);
        LayoutParams actionBarLayout = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
        actionBar.setLayoutParams(actionBarLayout);
        parentLayout.addView(actionBar);

        actionBar.setId(R.id.actionBar);
        LayoutParams contentLayout = new LayoutParams(LayoutParams.MATCH_PARENT, 0);
        contentLayout.addRule(RelativeLayout.BELOW, actionBar.getId());          
        contentLayout.addRule(RelativeLayout.ALIGN_WITH_PARENT_BOTTOM);
        contentView.setLayoutParams(contentLayout);
        parentLayout.addView(contentView);

        setContentView(parentLayout);
    }

}

成功了!非常感谢!但我更喜欢使用XML来解决这个问题 :) - Yriuns

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接