2017-04-03 61 views
4

我wana在放置在操作欄中的購物車圖片上添加通知徽章並以編程方式對其進行操作。任何幫助?通知徽章上的行動項目Android

+0

爲了「幫助」您,我們需要查看您已經編寫了哪些代碼,然後解釋什麼確切部分無法正確運行,然後解釋您在調查,調試和解決問題方面所做的工作,然後你可以解釋完成之後你完全有什麼困惑。 – csmckelvey

+0

我已經在菜單下使用menu.xml添加購物車圖像,我是新手佈局設計,所以無法找出添加通知計數,如果有人添加東西到購物車或刪除項目。 –

+0

@SubratPani請參閱下面的完整答案。 – FAT

回答

38

您可以通過創建一個MenuItem顯示custom layoutActionBar定製MenuItem。要設置自定義佈局,您必須使用菜單項屬性app:actionLayout

按照以下步驟在Cart操作項目上創建Badge。查看附件image的結果。

  1. 創建ImageView自定義佈局(對於車圖標)和TextView(對計數值)

佈局/ custom_action_item_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/ic_action_cart"/> 

    <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> 
  • 使用Shape創建可繪製的圓形badge背景。
  • 抽拉/ badge_background.xml:

    <?xml version="1.0" encoding="utf-8"?> 
    <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> 
    
        <solid android:color="@android:color/holo_red_dark"/> 
        <stroke android:color="@android:color/white" android:width="1dp"/> 
    
    </shape> 
    
  • 添加custom layout到菜單item
  • 菜單/ main_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_cart" 
         android:icon="@drawable/ic_action_cart" 
         android:title="Cart" 
         app:actionLayout="@layout/custom_action_item_layout" 
         app:showAsAction="always"/> 
    
    </menu> 
    
  • 在你MainActivity,添加以下代碼:
  • MainActivity.java:

    public class MainActivity extends AppCompatActivity { 
        ................ 
        ...................... 
        TextView textCartItemCount; 
        int mCartItemCount = 10; 
    
        @Override 
        protected void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
         setContentView(R.layout.activity_main); 
    
         ..................... 
         ............................ 
        } 
    
        @Override 
        public boolean onCreateOptionsMenu(Menu menu) { 
         getMenuInflater().inflate(R.menu.trash, menu); 
    
         final MenuItem menuItem = menu.findItem(R.id.action_cart); 
    
         View actionView = MenuItemCompat.getActionView(menuItem); 
         textCartItemCount = (TextView) actionView.findViewById(R.id.cart_badge); 
    
         setupBadge(); 
    
         actionView.setOnClickListener(new View.OnClickListener() { 
          @Override 
          public void onClick(View v) { 
           onOptionsItemSelected(menuItem); 
          } 
         }); 
    
         return true; 
        } 
    
        @Override 
        public boolean onOptionsItemSelected(MenuItem item) { 
    
         switch (item.getItemId()) { 
    
          case R.id.action_cart: { 
           // Do something 
           return true; 
          } 
         } 
         return super.onOptionsItemSelected(item); 
        } 
    
        private void setupBadge() { 
    
         if (textCartItemCount != null) { 
          if (mCartItemCount == 0) { 
           if (textCartItemCount.getVisibility() != View.GONE) { 
            textCartItemCount.setVisibility(View.GONE); 
           } 
          } else { 
           textCartItemCount.setText(String.valueOf(Math.min(mCartItemCount, 99))); 
           if (textCartItemCount.getVisibility() != View.VISIBLE) { 
            textCartItemCount.setVisibility(View.VISIBLE); 
           } 
          } 
         } 
        } 
    
        .................. 
        .............................. 
    
    } 
    

    OUTPUT:

    enter image description here

    +2

    謝謝@Ferdous艾哈邁德 –

    +0

    @SubratPani最歡迎的 – FAT

    +1

    自定義佈局不列入覆蓋車標誌@Ferdous艾哈邁德 –

    0

    最簡單的給予風格破解。

     <TextView 
           android:id="@+id/fabCounter" 
           style="@style/Widget.Design.FloatingActionButton" 
           android:layout_width="wrap_content" 
           android:layout_height="wrap_content" 
           android:layout_alignParentEnd="true" 
           android:layout_centerVertical="true" 
           android:layout_marginEnd="10dp" 
           android:padding="5dp" 
           android:text="10" 
           android:textColor="@android:color/black" 
           android:textSize="14sp" /> 
    

    Result

    +0

    請停止發送垃圾郵件相同的答案。相反,將問題標記爲重複 – Rob

    +0

    所有問題都有不同的含義,但解決方案完全相同。我給了不同的問題不同的答覆,但我使用相同的圖像。那有什麼不對? – Aks4125

    +1

    如果所有的問題都有相同的解決方案,它們很可能是重複的問題,但措詞不同。將問題關閉爲重複項有助於*未來的讀者*找到他們正在尋找的解決方案。目前,您的解決方案分佈在5個以上的職位。如果你回來編輯它,或者人們發現一個錯誤,現在需要在所有5個位置進行更新。 – Rob

    0

    也許這將是一個更快,更容易solution。 例如XML:

    <ru.nikartm.support.ImageBadgeView 
        android:id="@+id/ibv_icon2" 
        android:layout_width="80dp" 
        android:layout_height="80dp" 
        android:layout_marginTop="30dp" 
        android:layout_gravity="center" 
        android:padding="10dp" 
        app:ibv_badgeValue="100" 
        app:ibv_badgeTextSize="12sp" 
        app:ibv_fixedBadgeRadius="15dp" 
        app:ibv_badgeTextStyle="bold" 
        app:ibv_badgeTextColor="#ffffff" 
        app:ibv_badgeColor="#00ACC1" 
        app:ibv_badgeLimitValue="false" 
        android:src="@drawable/ic_shopping_cart" /> 
    

    或以編程方式:

    imageBadgeView.setBadgeValue(27) 
          .setBadgeOvalAfterFirst(true) 
          .setBadgeTextSize(16) 
          .setMaxBadgeValue(999) 
          .setBadgeTextFont(typeface) 
          .setBadgeBackground(getResources().getDrawable(R.drawable.rectangle_rounded)) 
          .setBadgePosition(BadgePosition.BOTTOM_RIGHT) 
          .setBadgeTextStyle(Typeface.NORMAL) 
          .setShowCounter(true) 
          .setBadgePadding(4); 
    

    Screen

    我希望這幫助。