2017-04-19 27 views
1

我試着操作欄這樣動作條配件點擊聽者不工作

Screenshot of my action Bar

我想就像我動作條上的項目點擊它會打印一個烤麪包,但它不工作嘗試了很多。

我創建了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中,我把這個onCreateOptionsMenu(),獲取通知和任務項目的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; 
     } 
    } 

試過很多方法,但在不工作的所有請從這裏幫幫忙..

回答

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.創建包含NotificationTaskmenu 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> 

在你的活動onCreateOptionsMenu(),得到的NotificationTask項目ActionView和設置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事件。

OUTPUT:

enter image description here

UPDATE:

在你更新的代碼使用:

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); 

希望這將有助於〜

+0

onOptionsItemSelected(菜單項); menuItem是什麼? – Andie

+0

檢查我更新的答案。它的您的項目和item1 – FAT

+0

它不工作.. – Andie