2012-08-23 7 views
9

प्रस्तुत करना मैं अपने ActionBar में कुछ अन्य विकल्पों के साथ एक साथ एक ShareActionProvider नहीं। ऐसा लगता है कि जब पोर्ट्रेट मोड में पहली बार प्रस्तुत किया गया है तो ShareActionProvider को ठीक से प्रस्तुत करने में समस्याएं हैं और यह पहले प्रस्तुत करने पर क्लिक करने योग्य नहीं है। एक ओरिएंटेशन चेंज स्क्रीन को दोबारा प्रस्तुत करता है और उसके बाद सभी विकल्पों को दिखाई देने वाला दिखाई देता है और जब एक्शनबार फिर से प्रस्तुत करता है तो फिर से पोर्ट्रेट मोड में ठीक से प्रस्तुत होता है।ShareActionProvider क्लिक करने योग्य नहीं और प्रतिपादन ठीक से पर पहले

मैं एक छवि है कि स्थिति का वर्णन करता है संलग्न किया है:

  1. शेयर विकल्प ठीक से प्रदान की गई नहीं है, यह यह करने के लिए आगे एक आइकन चाहिए और अगर यह लेआउट फिट नहीं करता है, यह होना चाहिए एक 3-डॉट मेनू बनें।

  2. उन्मुखीकरण के बाद सभी विकल्प के रूप में उम्मीद दिखाई दे रहे हैं।

  3. वापस चित्र को घूर्णन फिर से renders ActionBar और अब 3-बिंदुओं वाले मेनू एकदम सही ढंग से दिखाई देते हैं और यह क्लिक करने योग्य है।

यहां क्या हो रहा है पर कोई विचार है?

ActionBar description

यह मेरा एक्सएमएल है:

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" > 

    <item 
     android:id="@+id/item_delete" 
     android:icon="@android:drawable/ic_menu_delete" 
     android:showAsAction="ifRoom|withText" 
     android:title="Delete" 
     android:visible="false"/> 
    <item 
     android:id="@+id/item_edit" 
     android:icon="@android:drawable/ic_menu_edit" 
     android:showAsAction="ifRoom|withText" 
     android:title="Edit" 
     android:visible="false"/> 
    <item 
     android:id="@+id/item_share" 
     android:actionProviderClass="android.widget.ShareActionProvider" 
     android:showAsAction="ifRoom|withText" 
     android:title="Share" 
     android:visible="false"/> 
    <item 
     android:id="@+id/item_save" 
     android:icon="@android:drawable/ic_menu_save" 
     android:showAsAction="ifRoom|withText" 
     android:title="Save" 
     android:visible="false"/> 
    <item 
     android:id="@+id/menu_search" 
     android:actionViewClass="android.widget.SearchView" 
     android:icon="@android:drawable/ic_menu_search" 
     android:showAsAction="ifRoom" 
     android:title="@string/menu_search" 
     android:visible="false"/> 

</menu> 

और यह कैसे मैं एक टुकड़ा में विकल्प मेनू संभाल है:

/** 
* Hook into the OptionsMenu and add an Edit, Delete and Share option. 
*/ 
@Override 
public void onPrepareOptionsMenu(Menu menu) { 
    MenuItem deleteItem = menu.findItem(R.id.item_delete); 
    deleteItem.setVisible(true); 

    MenuItem editItem = menu.findItem(R.id.item_edit); 
    editItem.setVisible(true); 

    MenuItem shareItem = menu.findItem(R.id.item_share); 
    shareItem.setVisible(true); 
    shareActionProvider = (ShareActionProvider) shareItem.getActionProvider(); 
    shareActionProvider.setShareIntent(getShareIntent()); 

    super.onPrepareOptionsMenu(menu); 
} 

/** 
* Builds an intent that takes the path for the image and passes it to 
* the sharing mechanism as a stream built on the URI of the image path. 
* @return the intent to share the image as a stream 
*/ 
private Intent getShareIntent() 
{ 
    Intent shareIntent = new Intent(); 
    shareIntent.setAction(Intent.ACTION_SEND); 
    shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + receipt.getPhoto())); 
    shareIntent.setType("image/jpeg"); 
    return shareIntent; 
} 

उत्तर

28

ऐसा इसलिए है क्योंकि आपको onCreateOptionsMenu पर मेनू को बढ़ाने के बाद ShareActionPRovider पर एक इरादा जोड़ना होगा।

यदि आप केवल onPrepareOptionsMenu में ऐसा करते हैं, तो आपको एक्शनबार अद्यतन को ट्रिगर करने के लिए मैन्युअल रूप से invalidateOptionsMenu() पर कॉल करना होगा (जैसा कि चुना गया उत्तर आपको बताता है)। लेकिन ऐसा करने का तरीका नहीं है।

कॉन्फ़िगरेशन में परिवर्तन होने पर यह ठीक काम करता है, क्योंकि onPrepareOptionsMenu() कहा जाता है, और फिर आपका शेयर बटन काम करेगा, क्योंकि अब इसका इरादा है।

कि ठीक करने के लिए, बस कुछ इस तरह करते हैं:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    getSupportMenuInflater().inflate(R.menu.YOUR_MENU_XML, menu); 

    ShareActionProvider provider = (ShareActionProvider) menu.findItem(R.id.menu_share).getActionProvider(); 

    if (provider != null) { 
     Intent shareIntent = new Intent(); 
     shareIntent.setAction(Intent.ACTION_SEND); 
     shareIntent.putExtra(Intent.EXTRA_TEXT, YOUR_TEXT); 
     shareIntent.setType("text/plain"); 
     provider.setShareIntent(shareIntent); 
    } 

    return true; 
} 

इस तरह, ShareActionProvider शुरू से ही एक Intent होगा, और अपेक्षा के अनुरूप काम करेंगे।

+0

बहुत रोचक! जैसे ही मुझे कुछ खाली समय मिल जाएगा, मैं इसे देख लूंगा। धन्यवाद! – span

1

तो ऐसा लगता है कि आप को "getActivity () टुकड़ा मेकअप में onCreateView में .invalidateOptionsMenu() " मेनू को फिर से प्रस्तुत करना चाहिए जैसा कि इसे करना चाहिए। इसे पहले रन में ठीक से प्रस्तुत करना चाहिए, हालांकि इसमें बदलाव किए बिना मेनू को अमान्य करना उचित समाधान की तरह नहीं लगता है।

1

यह प्लेटफॉर्म बग की तरह seams। आप अधिक जानकारी के लिए यह http://code.google.com/p/android/issues/detail?id=25467 देख सकते हैं।

+0

धन्यवाद, जब मैं अपनी छुट्टियों से वापस आऊंगा तो इसमें देखेगा। – span

1

मुझे नहीं लगता कि यह एक बग है। ऐसा इसलिए है क्योंकि आपका शीर्षक बदल गया है। यह मूल रूप से "रसीददान" के बजाय छोटा था ("विवरण"), और इसलिए सिस्टम ने सोचा होगा कि अधिक क्रिया वस्तुओं को दिखाने के लिए और अधिक जगह थी।

इसके अलावा ShareActionProvider की चौड़ाई गतिशील है (यह अधिक से अधिक 2 बार सामान्य चौड़ाई तक हो सकती है)।

एक-दो बातें परीक्षण करने के लिए, मैं प्रस्ताव है कि आप पहले की स्थिति पर निर्भर शेयर कार्रवाई आइटम ले जाते हैं, अपने अस्थायी समाधान निकाल सकते हैं और देखें कि क्या वह अब भी होता होगा। आप शेयर एक्शन आइटम को भी हटा सकते हैं और परीक्षण के रूप में 3 या अधिक पारंपरिक क्रिया वस्तुओं का उपयोग कर सकते हैं।

+0

धन्यवाद, जब मैं अपनी छुट्टी से वापस आऊंगा तो इसमें देखेगा। – span

संबंधित मुद्दे