2013-04-24 19 views
10

के लिए प्रासंगिक क्रिया बार अजीब व्यवहार प्रासंगिक कार्रवाई बार में मेरे पास कुछ अजीब व्यवहार है।मेनू आइटम

सबसे पहले:

Clicking behavior overflow button of CAB

दूसरे/तीसरे:

एक मेनू आइटम केवल हर दूसरी बार मैं अतिप्रवाह बटन पर क्लिक करें दिखाया गया है

वहाँ एक तरीका है कि प्रतीक है इतनी जगह का उपयोग न करें?

जब मैं सभी वस्तुओं के लिए संपत्ति android:showAsAction="always" जोड़ने बदलने के लिए, वहाँ सभी चिह्न दिखाने के लिए वास्तव में पर्याप्त जगह - लेकिन मेरे हिस्से आइकन अब और क्लिक करने योग्य नहीं है:

All Items with showAsAction always

स्वच्छ परियोजना नहीं है मदद।

मैं अपने परीक्षण डिवाइस (गैलेक्सी एस 3) पर एंड्रॉइड 4.2.2 का उपयोग करता हूं। मदद नहीं की -

मैं भी पूरी तरह से मेरी XXX जीएस 3 पर एक नया ROM फ्लैश करने की कोशिश की (अब CyanogenMod 10.1, SlimBean से पहले, यह भी तल पर पर navigationbar निकाला गया)।

मैंने इसे Nexus 4 पर भी आजमाया। और जगह है, इसलिए शेयर बटन और डिलीट बटन दिखाई दे रहे हैं। शेयर बटन क्लिक करने योग्य नहीं है जब मैं एक्शन मोड शुरू करता हूं, लेकिन जब मैं डिवाइस को लैंडस्केप मोड में बदलता हूं तो यह काम करता है, और जब मैं इसे वापस पोर्ट्रेट पर बदलता हूं तो यह अभी भी काम करता है। तो मूल रूप से नेक्सस 4 पर, शेयर बटन घूर्णन से पहले काम नहीं करता है।


मैनिफ़ेस्ट:

<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="17" /> 

minSdkVersion=17 के खिलाफ संकलन कोई फर्क नहीं पड़ता।

मैं इस तरह एक टुकड़ा से कार्रवाई मोड शुरू:

mActionMode = activity.startActionMode(mMultipleCallback); 

ActionMode.Callback में मैं मेनू को पॉप्युलेट:

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item 
     android:title="@string/checkAll" 
     android:id="@+id/managementCABCheckAll" 
     android:icon="@android:drawable/checkbox_on_background"> 
    </item> 
    <item 
     android:title="@string/enable" 
     android:id="@+id/managementCABEnable" 
     android:icon="@drawable/sphere_green"> 
    </item> 
    <item 
     android:title="@string/disable" 
     android:id="@+id/managementCABDisable" 
     android:icon="@drawable/sphere_red"> 
    </item> 
    <item 
     android:title="@string/delete" 
     android:id="@+id/managementCABDelete" 
     android:icon="@android:drawable/ic_menu_close_clear_cancel"> 
    </item> 
    <item 
     android:title="@string/share" 
     android:id="@+id/managementCABShare" 
     android:actionProviderClass="android.widget.ShareActionProvider" 
     android:icon="@android:drawable/ic_menu_share"> 
    </item> 
    <item 
     android:title="@string/export" 
     android:id="@+id/managementCABExport" 
     android:icon="@drawable/explorer"> 
    </item> 
</menu> 

:

@Override 
public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
    MenuInflater inflater = mode.getMenuInflater(); 
    inflater.inflate(R.menu.management_cab, menu); 
    MenuItem item = menu.findItem(R.id.managementCABShare); 
    mShareActionProvider = (ShareActionProvider) item.getActionProvider(); 
    //...other stuff 
    return true; 
} 

और यहाँ एक्सएमएल है पूर्णता के लिए पूरे callback:

protected ActionMode.Callback mMultipleCallback = new ActionMode.Callback() { 

    private ShareActionProvider mShareActionProvider; 

    @Override 
    public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
     MenuInflater inflater = mode.getMenuInflater(); 
     inflater.inflate(R.menu.management_cab, menu); 
     MenuItem item = menu.findItem(R.id.managementCABShare); 
     mShareActionProvider = (ShareActionProvider) item.getActionProvider(); 
     hideUnwantedCABItems(menu); 
     return true; 
    } 

    @Override 
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
     List<Integer> checkedPositions = getAllCheckedPositions(); 
     switch (item.getItemId()) { 
     case R.id.managementCABCheckAll: 
      changeCheckedOfAllItems(true); 
      return true; 
     case R.id.managementCABEnable: 
      changeEnabled(checkedPositions, true); 
      return true; 
     case R.id.managementCABDisable: 
      changeEnabled(checkedPositions, false); 
      return true; 
     case R.id.managementCABDelete: 
      if (deleteAlert == null) 
       createDeleteDialog(checkedPositions); 
      initDeleteDialog(checkedPositions); 
      return true; 
     case R.id.managementCABShare: 
      Intent shareIntent = new Intent(); 
      shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE); 
      shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, exportItemsAndGetUris(checkedPositions)); 
      shareIntent.setType("application/xml"); 
      setShareIntent(shareIntent); 
      return true; 
     case R.id.managementCABExport: 
      String message; 
      if (StorageController.copyUriListToExportFolder(exportItemsAndGetUris(checkedPositions))) 
       message = getActivity().getString(R.string.export_success); 
      else 
       message = getActivity().getString(R.string.export_fail); 

      Toast.makeText(getActivity(), message + ":\n" + StorageController.getExternalExportApplicationFolder(), Toast.LENGTH_LONG).show(); 
      return true; 
     default: 
      return false; 
     } 
    } 

    @Override 
    public void onDestroyActionMode(ActionMode mode) { 
     mActionMode = null; 
     changeCheckedOfAllItems(false); 
    } 

    @Override 
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 
     return false; 
    } 

    private void setShareIntent(Intent shareIntent) { 
     if (mShareActionProvider != null) { 
      mShareActionProvider.setShareIntent(shareIntent); 
     } 
    } 
}; 
+0

आप अपने डिवाइस पर v14 का उपयोग करते हैं, या आप v14 एसडीके के खिलाफ संकलन करते हैं? –

+0

wtf क्यों नीचे वोट ?? वैसे भी मैं अपने डिवाइस पर 4.2.2 का उपयोग करता हूं - स्पष्टीकरण के लिए संपादन की जांच करें –

+0

यह मैं नहीं था, अगर आप v14 के खिलाफ संकलित करते हैं तो मैं पहले नवीनतम एसडीके के खिलाफ संकलन करने की कोशिश करता हूं। –

उत्तर

9

ठीक है, अनजान शेयर आइकन का समाधान। यह एपीआई से मुझे एक गलतफहमी थी।

मैंने सोचा था कि आप SharedActionProvider-Item को अपने मेनू XML फ़ाइल में हर अन्य आइटम की तरह व्यवहार कर सकते हैं। लेकिन वास्तव में आप नहीं कर सकते हैं। onActionItemClicked किसी आइकन के रूप में दिखाए जाने पर इस आइकन के लिए भी ट्रिगर नहीं किया गया है (यही कारण है कि जब आप showAsAction=always जोड़ते हैं तो यह क्लिक करने योग्य नहीं है)।मजेदार है, जब आइकन नहीं दिखाया जाता है तो क्लिक ईवेंट ट्रिगर होता है, लेकिन यह ओवरफ़्लो मेनू में दिखाई देता है। प्रासंगिक कार्रवाई बार में यह वास्तविक बग हो सकता है!

अब मैं अंत में पता लगा है आप कैसे उत्प्रेरित करने चाहिए एक SharedActionProvider-Item:

आप के लिए है onCreateActionMode विधि में एक Intent डाल (!):

public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
    MenuInflater inflater = mode.getMenuInflater(); 
    inflater.inflate(R.menu.management_cab, menu); 
    MenuItem item = menu.findItem(R.id.managementCABShare); 
    initSharedActionProvider(item); //Check out this method in the next code fragment 
    return false; 
} 

अब आप कह सकते हैं: "आप बेवकूफ , यह स्पष्ट था, और onActionItemClicked जैसा कि आपने पहले किया था, वैसे ही इरादे को हमेशा सेट करना बेहतर होगा "।

क्षमा करें, लेकिन मैं असहमत हूं: इसे वास्तव में यहां सेट करने के लिए यह समझ में नहीं आता है। कारण यह है: मेरे लिए आपके द्वारा जांच की जाने वाली प्रत्येक अतिरिक्त वस्तु के साथ इरादा बदलता है। यह आपके द्वारा चेक किए जाने वाले प्रत्येक आइटम के लिए एक निर्यात-एक्सएमएल फ़ाइल बनाता है, और जब भी कोई आइकन क्लिक किया जाता है तो मैं वास्तव में एक XML फ़ाइल नहीं बनाना चाहता हूं। यह कोई समझ नहीं आता है, और मैं चाहता हूं कि सभी एक्सएमएल फाइलें केवल तभी बनाई जाए जब कोई उपयोगकर्ता वास्तव में आइटम निर्यात करना चाहता हो।

तो मूल रूप से मैंने इसके लिए एक कामकाज किया। शुरुआत में, मैं Intent बना देता हूं और एक खाली List<Uri> जोड़ता हूं। यह सूची मेरी कक्षा में सदस्य चर के रूप में सहेजी गई है, इसलिए यदि मैं इसमें आइटम जोड़ता हूं, तो आइटम भी इरादे में होंगे। फिर जब उपयोगकर्ता शेयर आइटम पर क्लिक करता है, तो सूची सभी चयनित वस्तुओं के साथ पॉप्युलेट की जाती है। इसे पूरा करने के लिए मैंने OnShareTargetSelectedListener को ओवरराइड किया। यह विधि ट्रिगर होती है जब कोई उपयोगकर्ता कंक्रीट शेयर लक्ष्य (जैसे ईमेल, ड्रॉपबॉक्स इत्यादि) पर क्लिक करता है।

private void initSharedActionProvider(MenuItem item) { 
    mShareActionProvider = (ShareActionProvider) item.getActionProvider(); 
    mShareActionProvider.setOnShareTargetSelectedListener(new OnShareTargetSelectedListener() { 
     @Override 
     public boolean onShareTargetSelected(ShareActionProvider source, Intent intent) { 

      //Here is the exportedFiles list populated 
      exportItemsAndSetList(getAllCheckedPositions()); 
      return true; 
     } 
    }); 

    Intent shareIntent = new Intent(); 
    shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE); 

    //exportedFiles is a member Variable which I populate with the selected items, with the exportItemsAndSetList method 
    shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, exportedFiles); 
    shareIntent.setType("application/xml"); 
    mShareActionProvider.setShareIntent(shareIntent); 
} 

मुझे आशा है कि आप समझते हैं कि मैं वहाँ क्या किया:

अब यहाँ उस के लिए पूरे कोड (विधि केवल onCreateActionMode से एक बार कहा जाता है) है। यदि नहीं, तो पूछने के लिए स्वतंत्र महसूस करें।

उपर्युक्त सभी के साथ, मेरी समस्याओं में से एक हल हो जाती है (कि आइकन आइकन आइकन के रूप में दिखाए जाने पर क्लिक करने योग्य नहीं है) - लेकिन अन्य दो खुले रहते हैं (आइकन इतनी अधिक जगह और पहली समस्या का उपयोग नहीं करते हैं) ।


समस्या हल के 2 प्रकार:

लगता एंड्रॉयड माउस जो उच्च संकल्प फ़ोल्डर (HDPI, XHDPI) वास्तव में कर रहे हैं एक उच्च संकल्प में होने की जरूरत है जैसे - सक्षम मेरे/अक्षम आइकन केवल था 32x32 पिक्सेल का आकार (और मैंने उन्हें सभी फ़ोल्डर्स में रखा) और इसलिए एंड्रॉइड ने किसी भी तरह की बड़ी गड़बड़ी की, इसलिए केवल तीन आइकन एक्शन बार पर फिट हुए। मैंने बस सभी आइकनों को हटा दिया, लेकिन 32x32 पिक्सल के मूल वाले एमडीपीआई में मूल। अब एंड्रॉइड 32x32 पिक्सेल आइकन upscales और actionbar में पांच आइटम प्रदर्शित कर सकते हैं। यह अजीब तरह का है।


समस्या हल की 1 प्रकार:

इस तरह लग रहा है सीधे समस्या 2 से संबंधित था, जैसे ही मैं इस समस्या 2 हल, हटाएं आइकन कार्रवाई पट्टी पर सीधे रखा गया था।

कुछ परीक्षणों के साथ मैंने देखा कि पाठ हमेशा होता था अगर मैंने हटाए गए आइकन पर showAsAction=never जोड़ा। मुझे सच में लगता है कि इसमें समस्या 2 के साथ कुछ करना था (आइकन वास्तव में वहां खराब चीजें करते थे)।


मेरी समस्याएं लगभग हल हो गई हैं।

मुझे लगता है कि मुझे (नया) असली बग मिला है: सबसे हाल ही में उपयोग की गई शेयर कार्रवाई अतिप्रवाह आइकन पर चल रही है। जब वहाँ क्लिक करें, अतिप्रवाह मेनू अभी भी खोलता है, लेकिन यह काफी shitty दिखता है:

Most recent share icon above overflow icon

मैं इसे ठीक कैसे किया?

ठीक है, मैं इस **** के साथ गड़बड़ कर रहा हूं, इसलिए मैंने शेयर आइकन पर showAsAction=never जोड़ा। (और हाँ मैं this देखा, लेकिन अगर मैं ऐसा करते हैं, यह भी सामान्य जीवन चक्र का एक और परिवर्तन है मैं एक अपवाद मिल ...)

यदि आप एक बेहतर समाधान की तुलना में मैं इस्तेमाल किया पता टिप्पणी करने के लिए स्वतंत्र महसूस:>

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