【问题标题】:ActionBar Item Click listner is not working操作栏项目单击侦听器不起作用
【发布时间】:2017-04-19 11:53:54
【问题描述】:

我试过这样的动作栏

我想当我点击 Actionbar 的 Item 时它会打印一个 Toast 但它不工作尝试了很多。

我创建了 2 个自定义布局,一个用于通知自定义项,另一个用于任务自定义项。

custom_action_notification_layout.xml

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    style="?attr/actionButtonStyle"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:clipToPadding="false"
    android:focusable="true">

    <ImageView
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_gravity="center"
        android:src="@drawable/noti"/>

    <TextView
        android:id="@+id/cart_badge"
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:layout_gravity="right|end|top"
        android:layout_marginTop="3dp"
        android:layout_marginLeft="15dp"
        android:background="@drawable/badge_circle"
        android:gravity="center"
        android:padding="3dp"
        android:textColor="@android:color/white"
        android:text="0"
        android:textSize="10sp"/>

</RelativeLayout>

custom_action_task_layout.xml

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    style="?attr/actionButtonStyle"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:clipToPadding="false"
    android:focusable="true">

    <ImageView
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_gravity="center"
        android:src="@drawable/task"
        android:id="@+id/imageView5" />

    <TextView
        android:id="@+id/cart_badge1"
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:layout_marginLeft="15dp"
        android:layout_gravity="right|end|top"
        android:background="@drawable/badge_circle"
        android:gravity="center"
        android:padding="3dp"
        android:textColor="@android:color/white"
        android:text="0"
        android:textSize="10sp"
        android:layout_alignTop="@+id/imageView5"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

</RelativeLayout>

navigation.menu

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:apps="http://schemas.android.com/tools">

<item
    android:id="@+id/action_refresh"
    android:icon="@drawable/noti"
    app:showAsAction="always"
    android:actionLayout="@layout/custom_action_notification_layout"
    android:title="Refresh"/>
<item
    android:id="@+id/action_task"
    android:orderInCategory="100"
    android:actionLayout="@layout/custom_action_task_layout"
    android:title="Task"
    android:icon="@drawable/task"
    app:showAsAction="always" /></menu>

现在在我的 navigationdrawer.class 中,我将此代码放在 CreateOptionsMenu() 上,获取通知和任务项的 ActionView,并将 OnClick 侦听器设置为这些 ActionView。

navigation.class

@Override
    public boolean onCreateOptionsMenu(final Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.navigation, menu);
        // Notification
        final MenuItem itemNotification = menu.findItem(R.id.action_refresh);
        MenuItemCompat.setActionView(itemNotification, R.layout.custom_action_notification_layout);
        View actionViewNotification = MenuItemCompat.getActionView(itemNotification);

      //  RelativeLayout notifCount = (RelativeLayout) MenuItemCompat.getActionView(itemNotification);
        actionViewNotification.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onOptionsItemSelected(itemNotification);
            }
        });
        final MenuItem itemNotification1 = menu.findItem(R.id.action_task);
        MenuItemCompat.setActionView(itemNotification1, R.layout.custom_action_task_layout);
        View actionViewNotification1 = MenuItemCompat.getActionView(itemNotification1);

    //   RelativeLayout notifCount1 = (RelativeLayout) MenuItemCompat.getActionView(itemNotification1);
        actionViewNotification1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onOptionsItemSelected(itemNotification1);
            }
        });

现在终于在 onOptionsItemSelected() 代码是这样的

public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_refresh: {
            // Do something
            Toast toast = Toast.makeText(this, "Notification clicked", Toast.LENGTH_LONG);
            toast.setGravity(Gravity.CENTER, 0, 0);
            toast.show();
            return true;
        }
        case R.id.action_task: {
            // Do something
            Toast toast = Toast.makeText(this, "Task clicked", Toast.LENGTH_SHORT);
            toast.setGravity(Gravity.CENTER, 0, 0);
            toast.show();
            return true;
        }
    }

尝试了很多方法,但根本不起作用,请帮忙..

【问题讨论】:

    标签: java android navigation


    【解决方案1】:

    1.创建两个custom layout,一个用于Notification自定义item,另一个用于Task自定义item

    custom_action_notification_layout.xml

    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout
        style="?attr/actionButtonStyle"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:clipToPadding="false"
        android:focusable="true">
    
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:src="@drawable/icon_notification"/>
    
        <TextView
            android:id="@+id/cart_badge"
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:layout_gravity="right|end|top"
            android:layout_marginEnd="-5dp"
            android:layout_marginRight="-5dp"
            android:layout_marginTop="3dp"
            android:background="@drawable/badge_background"
            android:gravity="center"
            android:padding="3dp"
            android:textColor="@android:color/white"
            android:text="0"
            android:textSize="10sp"/>
    
    </FrameLayout>
    

    custom_action_task_layout.xml

    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout
        style="?attr/actionButtonStyle"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:clipToPadding="false"
        android:focusable="true">
    
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:src="@drawable/icon_task"/>
    
        <TextView
            android:id="@+id/cart_badge"
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:layout_gravity="right|end|top"
            android:layout_marginEnd="-5dp"
            android:layout_marginRight="-5dp"
            android:layout_marginTop="3dp"
            android:background="@drawable/badge_background"
            android:gravity="center"
            android:padding="3dp"
            android:textColor="@android:color/white"
            android:text="0"
            android:textSize="10sp"/>
    
    </FrameLayout>
    

    2. 创建一个包含NotificationTask 项的menu XML。使用属性app:actionLayoutcustom layout 设置为每个item

    custom_menu.xml

    <menu
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto" >
    
        <item
            android:id="@+id/action_notification"
            android:icon="@drawable/icon_notification"
            android:title="Notification"
            app:actionLayout="@layout/custom_action_notification_layout"
            app:showAsAction="always"/>
    
        <item
            android:id="@+id/action_task"
            android:icon="@drawable/icon_task"
            android:title="Task"
            app:actionLayout="@layout/custom_action_task_layout"
            app:showAsAction="always"/>
    
    </menu>
    

    3. 在您的活动onCreateOptionsMenu() 中,获取ActionViewNotificationTask 项目并将OnClick 听众设置为那些ActionView

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.custom_menu, menu);
    
        // Notification
        final MenuItem itemNotification = menu.findItem(R.id.action_notification);
        View actionViewNotification = MenuItemCompat.getActionView(itemNotification);
        actionViewNotification.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onOptionsItemSelected(itemNotification);
            }
        });
    
        // Task
        final MenuItem itemTask = menu.findItem(R.id.action_task);
        View actionViewTask = MenuItemCompat.getActionView(itemTask);
        actionViewTask.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onOptionsItemSelected(itemTask);
            }
        });
    
        return true;
    }
    

    4. 最后,在onOptionsItemSelected() 中完成剩下的工作:

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    
        switch (item.getItemId()) {
            case R.id.action_notification: {
                // Do something
                Toast toast = Toast.makeText(this, "Notification clicked", Toast.LENGTH_SHORT);
                toast.setGravity(Gravity.CENTER, 0, 0);
                toast.show();
                return true;
            }
            case R.id.action_task: {
                // Do something
                Toast toast = Toast.makeText(this, "Task clicked", Toast.LENGTH_SHORT);
                toast.setGravity(Gravity.CENTER, 0, 0);
                toast.show();
                return true;
            }
        }
        return super.onOptionsItemSelected(item);
    }
    

    仅供参考,我通过显示Toast 消息检查了NotificationTask 菜单项click 事件。

    输出:

    更新:

    在您更新的代码中使用:

    MenuItemCompat.setActionView(itemNotification, R.layout.custom_action_notification_layout);
    View actionViewNotification = MenuItemCompat.getActionView(itemNotification);
    

    代替

    View actionViewNotification = MenuItemCompat.getActionView(itemNotification);
    MenuItemCompat.setActionView(itemNotification, R.layout.custom_action_notification_layout);
    

    希望对你有所帮助~

    【讨论】:

    • onOptionsItemSelected(menuItem); menuItem 有什么用?
    • 能否提供您的导航菜单代码以及badgemenu和badgetask的自定义布局?
    • 我已经更新了我的答案,完全实现了带有点击操作的自定义菜单项。希望这能帮助您找出问题。
    • 你应该先设置ActionView。更新您的代码如下: MenuItemCompat.setActionView(itemNotification, R.layout.custom_action_notification_layout);查看 actionViewNotification = MenuItemCompat.getActionView(itemNotification);
    • 我很高兴 :)... 很高兴知道它的工作原理
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多