简体   繁体   中英

Custom Action View layout not responding to menu item lisetener

I have created one custom action view layout using MenuItemCompat Java code is as shown in code below :

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        MenuItem shoppingCartitem = menu.findItem(R.id.my_action_item_id);
        shoppingCartitem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
Log.v("MyAPP", "Listener called");
                return true;
            }
        });
        MenuItemCompat.setActionView(shoppingCartitem, R.layout.my_custom_action_view_layout);
        return super.onCreateOptionsMenu(menu);
    }

menu_main.xml as follows :

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:myapp="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity">

    <item
        android:id="@+id/my_action_item_id"
        android:icon="@drawable/ic_shopping_cart_white_24dp"
        android:orderInCategory="9999"
        android:title="@string/menu"
        myapp:showAsAction="always" />

</menu>

What am I missing here, any suggestions ?

From the documentation :

Set a custom listener for invocation of this menu item. In most situations, it is more efficient and easier to use onOptionsItemSelected(MenuItem) or onContextItemSelected(MenuItem).

So you can simply override the onOptionsItemSelected callback, which is easier.

By the way to me your code seems to be right, but it doesn't do anything. Have you tried doing something like Log.v("MyAPP", "Listener called"); inside it?

EDIT:

I wrote this code:

MainActivity.java:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main_activity);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main_menu, menu);
        MenuItem item = menu.findItem(R.id.my_action_item_id);
        item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {

            @Override
            public boolean onMenuItemClick(MenuItem item) {
                Log.v("MyApp", "Inside listener");
                return true;
            }
        });

        MenuItemCompat.setActionView(item, R.layout.main_activity);
        return super.onCreateOptionsMenu(menu);
    }

}

main_menu.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:myapp="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity">

    <item
        android:id="@+id/my_action_item_id"
        android:icon="@drawable/ic_launcher"
        android:orderInCategory="9999"
        android:title="Menu"
        myapp:showAsAction="always" />

</menu>

And this is the result of the LogCat (I clicked the icon twice):

LogCat

As you can see it works without problems

please try

MenuItem shoppingCartitem = menu.findItem(R.id.my_action_item_id);

change to

MenuItem shoppingCartitem = (MenuItem) findViewById(R.id.my_action_item_id);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM