2012-11-26 47 views
12

में मेनू आइटम पर गतिशील मानों को कैसे कार्यान्वित करें मेरे पास एक्शन बार में मेनू आइटम है। मेनू आइटम छवि के साथ, मुझे इसके साथ जुड़े कुछ नंबर दिखाना होगा जो अक्सर बदल जाएगा। मैं एक्शन बार शेरलॉक का उपयोग नहीं कर रहा हूं। मैं इसका उपयोग नहीं करना चाहता। इसके अलावा सब कुछ ठीक काम करता है। दिखाए गए चित्र में, सफेद आइकन रंग आइकन मेरा है। मुझे गतिशील रूप से लाल रंग की पृष्ठभूमि के साथ संख्या उत्पन्न करने की आवश्यकता है। मैं एंड्रॉइड में ऐसा कैसे कर सकता हूं?एंड्रॉइड

enter image description here

अपडेट::

मैं अपने menu.xml में इस मेनू आइटम है

यहाँ नमूना छवि है। यह एक अधिसूचना मेनू आइटम की तरह काम करना चाहिए जो अधिसूचना गिनती की संख्या दिखाता है। मैं मेनू आइकन की तरह,

menuItem.setIcon(image); 

सेट अब, मेनू आइटम मैं एक पाठ दृश्य जो सूचनाएं की कुल संख्या है जगह की जरूरत है की चोटी पर।

क्या यह कार्यक्षमता व्यूबैगर के साथ कार्यान्वित करना संभव है?

एक कस्टम Drawable है कि आप पृष्ठभूमि और छवि के शीर्ष पर पाठ में छवि रंग बनाएँ: Github url

उत्तर

6

मैंने पाया कि मेनू आइटम में एक्शन व्यू कैसे जोड़ें और कोड में दृश्य में सेट मान के रूप में पुनर्प्राप्त करें।

यहाँ देखें: https://stackoverflow.com/a/16648170/857681

1

यहाँ एक बात तुम कोशिश कर सकते है। नमूना के लिए this post देखें।

फिर इस Drawable गतिशील MenuItem पृष्ठभूमि के रूप में ...

+0

मैं यह – intrepidkarthi

0

उपयोग कार्रवाई दृश्य सेट। यह दोनों के साथ काम करता है: डिफ़ॉल्ट ActionBar और ActionBarSherlock

Here is an example

इस दृष्टिकोण के साथ

तुम सिर्फ बना सकते हैं अपने खुद के View और उसके बाद, जो कुछ भी आप चाहते हैं (परिवर्तन पृष्ठभूमि, परिवर्तन सामग्री करना एक और दृश्य जोड़ गतिशील यदि आपके कार्रवाई दृश्य उपवर्ग है (उदाहरण के लिए कुछ लेआउट बढ़ा-चढ़ाकर द्वारा) ViewGroup आदि)।

5

अतः मैं ब्लॉग में बदल गया पर के लगभग सभी संसाधनों को आज़माने का एक बहुत बाद; सफलतापूर्वक। मैं साझा करना चाहता हूं कि मेरे लिए क्या काम किया (एपीआई> = 13); source

की मिठाई कोड के साथ शुरू करते हैं, जिस तरह से यह किया जाता है:

public boolean onCreateOptionsMenu(Menu menu) { 
    //inflate menu 
    getMenuInflater().inflate(R.menu.menu_my, menu); 

    // Get the notifications MenuItem and LayerDrawable (layer-list) 
    MenuItem item = menu.findItem(R.id.action_notifications); 
    LayerDrawable icon = (LayerDrawable) item.getIcon(); 

    // Update LayerDrawable's BadgeDrawable 
    Utils2.setBadgeCount(this, icon, 2); 

    return true; 
} 

menu_my.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:context=".MainActivity"> 
    <item 
     android:id="@+id/action_notifications" 
     android:icon="@drawable/ic_menu_notifications" 
     android:title="Notifications" 
     app:showAsAction="always" /> 
</menu> 

इस वर्ग को आसानी से BadgeDrawable करता है कि; इसकी उपस्थिति को भी संशोधित किया जा सकता है:

public class BadgeDrawable extends Drawable { 

    private float mTextSize; 
    private Paint mBadgePaint; 
    private Paint mTextPaint; 
    private Rect mTxtRect = new Rect(); 

    private String mCount = ""; 
    private boolean mWillDraw = false; 

    public BadgeDrawable(Context context) { 
     //mTextSize = context.getResources().getDimension(R.dimen.badge_text_size); 
     mTextSize = 12F; 

     mBadgePaint = new Paint(); 
     mBadgePaint.setColor(Color.RED); 
     mBadgePaint.setAntiAlias(true); 
     mBadgePaint.setStyle(Paint.Style.FILL); 

     mTextPaint = new Paint(); 
     mTextPaint.setColor(Color.WHITE); 
     mTextPaint.setTypeface(Typeface.DEFAULT_BOLD); 
     mTextPaint.setTextSize(mTextSize); 
     mTextPaint.setAntiAlias(true); 
     mTextPaint.setTextAlign(Paint.Align.CENTER); 
    } 

    @Override 
    public void draw(Canvas canvas) { 
     if (!mWillDraw) { 
      return; 
     } 

     Rect bounds = getBounds(); 
     float width = bounds.right - bounds.left; 
     float height = bounds.bottom - bounds.top; 

     // Position the badge in the top-right quadrant of the icon. 
     float radius = ((Math.min(width, height)/2) - 1)/2; 
     float centerX = width - radius - 1; 
     float centerY = radius + 1; 

     // Draw badge circle. 
     canvas.drawCircle(centerX, centerY, radius, mBadgePaint); 

     // Draw badge count text inside the circle. 
     mTextPaint.getTextBounds(mCount, 0, mCount.length(), mTxtRect); 
     float textHeight = mTxtRect.bottom - mTxtRect.top; 
     float textY = centerY + (textHeight/2f); 
     canvas.drawText(mCount, centerX, textY, mTextPaint); 
    } 

    /* 
    Sets the count (i.e notifications) to display. 
    */ 
    public void setCount(int count) { 
     mCount = Integer.toString(count); 

     // Only draw a badge if there are notifications. 
     mWillDraw = count > 0; 
     invalidateSelf(); 
    } 

    @Override 
    public void setAlpha(int alpha) { 
     // do nothing 
    } 

    @Override 
    public void setColorFilter(ColorFilter cf) { 
     // do nothing 
    } 

    @Override 
    public int getOpacity() { 
     return PixelFormat.UNKNOWN; 
    } 
} 

यह कक्षा जो संख्या निर्धारित करने में मदद करती है। res/drawable में

public class Utils2 { 
    public static void setBadgeCount(Context context, LayerDrawable icon, int count) { 

     BadgeDrawable badge; 

     // Reuse drawable if possible 
     Drawable reuse = icon.findDrawableByLayerId(R.id.ic_badge); 
     if (reuse != null && reuse instanceof BadgeDrawable) { 
      badge = (BadgeDrawable) reuse; 
     } else { 
      badge = new BadgeDrawable(context); 
     } 

     badge.setCount(count); 
     icon.mutate(); 
     icon.setDrawableByLayerId(R.id.ic_badge, badge); 
    } 


} 

और मुई importante एक drawable (एक लेआउट की तरह):: मैं तिथि के रूप में स्थापित करने के लिए बिल्ला, आदि और भी अधिक thods को लागू करने की सलाह देते हैं

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
     android:id="@+id/ic_notification" 
     android:drawable="@drawable/ice_skate" 
     android:gravity="center" /> 

    <!-- set a place holder Drawable so android:drawable isn't null --> 
    <item 
     android:id="@+id/ic_badge" 
     android:drawable="@drawable/ice_skate" /> 
</layer-list> 

अच्छा lucks!

+0

आज़माउंगा क्या आपके ic_menu_notifications नीचे सूचीबद्ध सूची सूची फ़ाइल है? – Lampard

+0

आपने अभी स्रोत से कोड कॉपी किया है। कृपया ऐसा करना बंद करो। – Mahori

+0

@ रवि, यह मैंने नहीं किया है; स्रोत लिंक अब भी काम नहीं करता है; और मैं आपको आश्वस्त कर सकता हूं कि यह कोड मेरे ऐप पर उत्पादन करने से पहले यहां पोस्ट किया गया था; यह समझाना महत्वपूर्ण है कि कोड के 5 ब्लॉक कैसे काम करते हैं। – msysmilu