Вот пример создания пользовательского MenuItem
для ActionBar
.
Первый: Создайте View
, который будет служить вашим MenuItem
.
ActionLayoutExample
/**
* A {@link RelativeLayout} that serves as a custom {@link MenuItem}
*/
public class ActionLayoutExample extends RelativeLayout {
/** The MenuItem */
private TextView mHello;
/**
* Constructor for <code>ActionLayoutExample</code>
*
* @param context The {@link Context} to use
* @param attrs The attributes of the XML tag that is inflating the view
*/
public ActionLayoutExample(Context context, AttributeSet attrs) {
super(context, attrs);
// Ensure the MenuItem is accessible
CheatSheet.setup(this);
}
/**
* {@inheritDoc}
*/
@Override
protected void onFinishInflate() {
super.onFinishInflate();
// Initialize the TextView
mHello = (TextView) findViewById(android.R.id.text1);
mHello.setTypeface(myTypeface);
mHello.setText("Hello");
}
}
Второй: Создать макет, который вы на самом деле применить к MenuItem
.
action_layout_example
<your.package.name.ActionLayoutExample xmlns:android="http://schemas.android.com/apk/res/android"
style="?android:attr/actionButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?android:attr/selectableItemBackground"
android:clickable="true"
android:contentDescription="@string/hello_world" >
<TextView
android:id="@android:id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</your.package.name.ActionLayoutExample>
Это важно включить стиль style="?android:attr/actionButtonStyle"
, чтобы убедиться, что расположение правильно отражает ActionBar
элементы. Также важно включить в ваш макет android:contentDescription
. Обычно, когда вы долго нажимаете MenuItem
со значком, отображается всплывающая подсказка, указывающая, для чего это MenuItem
. В вашем случае вам нужно сделать дополнительный шаг, чтобы убедиться, что эта всплывающая подсказка все еще доступна.
Отличный помощник для этого является Roman Nurik's CheatSheet. Вы можете увидеть, как я использую его в конструкторе макета действия.
Вы специально задали вопрос о выборе MenuItem
. Для этого обязательно укажите атрибуты android:background="?android:attr/selectableItemBackground"
и android:clickable="true"
.
Третий: Используйте атрибут android:actionLayout
, чтобы установить расположение и надуть меню обычно в пределах своего Activity
или Fragment
.
your_menu
<item
android:id="@+id/action_typeface"
android:actionLayout="@layout/action_layout_example"
android:showAsAction="ifRoom"
android:title="@string/hello_world"/>
Использование MenuItem
В onCreateOptionsMenu
вызова MenuItem.getActionView
и View.onClickListener
.Это происходит потому, что onOptionsItemSelected
не будет вызываться для пользовательского View
final View example = menu.findItem(R.id.action_typeface).getActionView();
example .setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// Do something
}
});
Результаты
спасибо, я попробую это –
Я забыл упомянуть, что вам нужно позвонить 'MenuItem.getActionView', чтобы на самом деле его использовать. Извините, я обновил свой ответ. На самом деле, я думаю, это то, что вы искали все это время. Наверное, я дал вам более длинный ответ, чем вы рассчитывали. – adneal
Отличный ответ, спасибо! –