OnOptionsItemSelected не получает вызов при использовании пользовательского вида действия

Я установил пользовательский вид для одного из моих панелей меню MenuBar, как этот

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.loop_thread, menu);
        ImageView iv = (ImageView)(getLayoutInflater().inflate(R.layout.image_container, null));
        menu.findItem(R.id.action_filter).setActionView(iv);
        ...

но когда я нажимаю этот пункт меню в своем приложении, onOptionsItemSelected() не вызывается. (Я проверил это, установив точку останова в начале метода). Если я нажимаю другие кнопки, на панели действий вызывается onOptionsItemSelected().

здесь находится пользовательский вид xml code fo rmy:

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ibtnFilterMenu"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@android:color/darker_gray"
    android:src="@drawable/btn_action_down_arrow"
    style = "@android:style/Widget.ActionButton"/>

Я также попытался установить представление Action в файле xml меню:

    <item android:id="@+id/action_filter"
    android:title="@string/filter_options"
    android:actionLayout="@layout/image_container"
    android:orderInCategory="100"
    android:showAsAction="ifRoom" />

Примечание. Я знаю, что могу сделать изображение кликабельным и вручную установить onClickListener для него, но ради обучения я хочу разобраться в этом.

Ответы

Ответ 1

Похоже, что базовый код, который раздувает и рисует элементы действия, не связывает содержимое настраиваемого макета, установленного setActionView() или android:actionLayout="@layout/image_container".

Возможно, потому, что макет может быть чем угодно, и просто кнопка или изображение. Поэтому я должен вручную установить значок onClickListener для значка. Для организации я просто вызываю onOptionsItemSelected() из метода OnClick моего значка, но я могу просто определить действие внутри метода OnClick.

сначала объявите filterMenuItem в Activity.

MenuItem filterMenuItem;

public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.loop_thread, menu);
    filterMenuItem = menu.findItem(R.id.action_filter);

    filterMenuItem.getActionView().setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            MainActivity.this.onOptionsItemSelected(filterMenuItem);
    }
});

Ответ 2

вам нужно вызвать метод menu.add() и implemenet onPreareOptionsmenu вместо метода oncreateoptionsmenu. Это мой код:

@Override
    public boolean onPrepareOptionsMenu(Menu menu) {                

        menu.clear();       
        if(mAlbum.getStatus() == Album.STATUS_VIDEO_AVAILABLE)
        {
            menu.add(0, 0 , 0, getString(R.string.edit_album))
            .setIcon(R.drawable.edit_album_icon);
            menu.add(0, 1 , 0, getString(R.string.delete_album))
            .setIcon(R.drawable.delete_album_icon);
            menu.add(0, 2 , 0, getString(R.string.download_video))
            .setIcon(R.drawable.download_vdo_icon);
            menu.add(0, 3 , 0, getString(R.string.upload_to_ambivo))
            .setIcon(R.drawable.share_ambivo_icon);
            menu.add(0, 4 , 0, getString(R.string.upload_to_facebook))
            .setIcon(R.drawable.share_fb_icon);
            menu.add(0, 5 , 0, getString(R.string.upload_to_youtube))
            .setIcon(R.drawable.share_yt_icon);

        }
        else{
            MenuInflater inflater = getMenuInflater();
            inflater.inflate(R.menu.albummenu, menu);
            if(mAlbum.getAlbumType() == Album.COMPOSITE_VIDEOS)
                menu.findItem(R.id.convert_album).setVisible(false);
        }

        return true;
    }