2016-03-08 5 views
1

У меня есть ActionBar, для которого я добавляю несколько объектов MenuItems внутри метода Activity onCreateOptionsMenu(Menu). Но мне нужно переопределить описание содержимого для одного из этих элементов.Как переопределить описание содержимого для панели действий MenuItem?

Я думал об определении MenuItem в XML и настройке атрибута actionViewClass. И вернитесь в исходный код, вызовите MenuItem.getActionView() для MenuItem, как описано в http://developer.android.com/training/appbar/action-views.html. Таким образом я мог бы позвонить setContentDescription() в объект View, который он возвращает. Но я предпочел бы сделать это, не используя XML-файл.

Есть ли у кого-нибудь идеи, кроме использования опции XML?

ответ

1

ОК, я понял это. К счастью, мне не пришлось обращаться к альтернативе XML. Мне нужно было создать новый объект View и apply it as the MenuItem's actionView. Трудная часть была на самом деле для стиля объекта вида, поскольку любая обычная MenuItem будет выглядеть для текущей темы (если бы я добавил ее без использования actionView). Выполняет фрагмент (при условии, что название моей деятельности составляет MyActivity):

public boolean onCreateOptionsMenu(Menu menu) { 
     Button buttonView = new Button(this, null, android.R.attr.actionButtonStyle); 
     if (Build.VERSION.SDK_INT < 23) { 
      buttonView.setTextAppearance(this, android.R.style.TextAppearance_DeviceDefault_Widget_ActionBar_Menu); 
     } else { 
      buttonView.setTextAppearance(android.R.style.TextAppearance_DeviceDefault_Widget_ActionBar_Menu); 
     } 
     buttonView.setText(R.string.option_title); // button label 
     buttonView.setContentDescription("Content description"); 
     buttonView.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View view) { 
       MyActivity.this.onOptionsItemSelected(item); 
      } 
     }); 

     MenuItem item = menu.add(R.string.option_title); 
     item.setActionView(buttonView); 
     ... 
     return super.onCreateOptionsMenu(menu); 
    }