Xamarin Android пункт меню не использует тему приложения

Я не могу понять, как сделать тему приложения применимой к пункту меню в панели действий. У меня есть тема приложения в xml-файле темы.

   <?xml version="1.0" encoding="utf-8" ?>
<resources>
  <style name="CustomAppTheme" parent="@android:style/Theme.Holo.Light">
    <item name="android:actionBarStyle">@style/CustomActionBar</item>
    <item name ="android:itemTextAppearance">@style/MenuItemTextAppearance</item>
    <!--<item name="android:actionMenuTextAppearance">@style/CustomActionBarTextAppearance</item>-->
  </style>

  <!--<style name="CustomActionBarTheme" parent="@android:style/Theme.Holo.Light.DarkActionBar">
    <item name ="android:actionBarStyle">@style/CustomActionBar</item>
  </style>-->

  <style name="CustomActionBar" parent ="@android:style/Widget.Holo.Light.ActionBar.Solid.Inverse">
    <!--<item name="android:height">75dp</item>-->
    <item name="android:displayOptions"></item>
    <item name="android:background">#ffffff</item>
    <!--<item name="android:textColor">#000000</item>-->
    <item name="android:titleTextStyle">@style/CustomActionBarTextAppearance</item>
  </style>

  <style name="CustomActionBarTextAppearance" parent="@android:style/TextAppearance.Holo.Widget.ActionBar.Title">
    <item name="android:textColor">#000000</item>
    <item name="android:textSize">16sp</item>
  </style>

  <style name="MenuItemTextAppearance" parent="@android:style/TextAppearance.Holo.Widget.ActionBar.Title">
    <item name="android:textColor">#000000</item>
    <item name="android:textSize">16sp</item>
  </style>
</resources>

и в моем классе активности у меня есть это в OnCreateOptionsMenu

public override bool OnCreateOptionsMenu(IMenu menu)
{
    //some stuff

    ActionBar.SetDisplayShowTitleEnabled(true);

   MenuInflater.Inflate(Resource.Menu.action_bar, menu);


    return base.OnCreateOptionsMenu(menu);
}

Ресурс.Меню.action_bar указывает на этот элемент

<menu >
  <item
      android_id="@+id/right_drawer_menu"
      android_title="MENU"
      android_showAsAction="always"/>
</menu>

Заголовок (строка меню) надутого пункта меню не использует тему приложения, и я не могу его изменить. Название действия, однако, использует указанную тему (CustomActionBarTextAppearance). Как это исправить?

1 ответ

  1. itemTextAppearance работает только на подтемах, которые не являются главными. Чтобы заставить его работать на верхнем пункте меню, я нашел только один вариант

    1. определение actionViewClass для элемента меню
    2. стиль его в OnCreateOptionsMenu
    3. Тогда проблема в том, как обработать щелчок. Я не мог передать его родителям (не работал для меня), поэтому решение ниже.
      Единственная проблема с этим ответом заключается в том, что меню почему-то открывается с левой стороны, но не под «меню», где оно должно быть, и AFAIK мы не можем его изменить.
      Поэтому я бы предложил не использовать подменю itmes, а показать всплывающее подменю.

    action_bar.XML

    <?xml version="1.0" encoding="utf-8" ?> 
    <menu >
      <item
          android_id="@+id/right_drawer_menu"
          android_showAsAction="always"
          android_actionViewClass="android.widget.Button">
    
        <menu>
          <item android_id="@+id/create_new"
                android_title="New" />
          <item android_id="@+id/open"
                android_title="Open" />
        </menu>
    
      </item>
    </menu>
    

    Активность

    IMenu myOptionsMenu;
    public override bool OnCreateOptionsMenu(IMenu menu)
    {
        //some stuff
    
        ActionBar.SetDisplayShowTitleEnabled(true);
    
        MenuInflater.Inflate(Resource.Menu.action_bar, menu);
        myOptionsMenu = menu;
    
        var item = menu.FindItem(Resource.Id.right_drawer_menu);
    
        var button = item.ActionView as Button;
        if (button != null)
        {
            button.Text = "MENU";
            button.SetTextColor(Color.Red);
            button.SetBackgroundColor(Color.Transparent);
            button.Click += menuClick;
        }
    
        return base.OnCreateOptionsMenu(menu);
    }
    
    
    private void menuClick(object sender, EventArgs e)
    {
        myOptionsMenu.PerformIdentifierAction(Resource.Id.right_drawer_menu, MenuPerformFlags.None);
        var item = myOptionsMenu.FindItem(Resource.Id.right_drawer_menu);
    
    }
    

    Введите описание изображения здесь