Contextual action bar weird behavior for menu item

限于喜欢 提交于 2019-12-05 01:31:27
OschtärEi

Okay, the solution to the unclickable share icon. This was kind of a misunderstanding from me to the API.

I thought you could treat a SharedActionProvider-Item like every other item in your menu XML file. But actually you can't. onActionItemClicked is not even triggered for this icon when it's shown as an action (this is why it's not clickable when you add showAsAction=always). Funny enough, the click event is triggered when the icon is not shown, but it is visible in the overflow menu. This may be an actual bug in the contextual action bar!

Now I finally figured out how you should trigger a SharedActionProvider-Item:

You have to (!) put a Intent in the onCreateActionMode method:

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

Now you may say: "You idiot, this was obvious, and it's even better to set the intent always there instead as in the onActionItemClickedMethod as you did before".

Sorry, but I disagree: It does not really make sense to set it here. The reason is: For me the intent changes with every additional item you check. It creates an export-XML file for each item you check, and I really don't want to create an XML file each time an icon is clicked. This makes no sense, and I want all XML files to be created only when a user really wants to export the items.

So basically I made a workaround for this. At the beginning, I make an Intent and add an empty List<Uri>. This list is saved as a member variable in my class, so if I add items to it, the items will also be in the intent. Then when the user clicks the share item, the list is populated with all selected items. To accomplish this I overrode the OnShareTargetSelectedListener. This method is triggered when a user clicks on a concrete share target (like email, dropbox, etc.).

Now here's the whole code for that (the method is only called once from onCreateActionMode):

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

I hope you understand what I did there. If not, feel free to ask.

With all this above, one of my problems is solved (that the share icon is not clickable when shown as an icon) - but the other two remain open (icons shouln't use so much space and the first problem).


Problem 2 kind of solved:

Seems like Android needs the icons which are in the higher resolution folders (hdpi, xhdpi) really to be in a higher resolution - my enable / disable icon had only a size of 32x32 pixels (and I just put them in all folders) and therefore Android made a big mess somehow, so only three icons did fit on the action bar. I just removed all icons, but the original ones of 32x32 pixels in mdpi. Now Android upscales the 32x32 pixels icons and can display five items in the actionbar. It is kind of strange.


Problem 1 kind of solved:

Looks like this was directly related to problem 2, as soon as I solved problem 2, the delete icon was placed directly on the action bar.

Also with some testing I saw that the text was always there if I added showAsAction=never to the delete icon. I really think it had something to do with problem 2 (the icons really did bad stuff there).


My problems are almost solved.

I think I got a (new) real bug now: the most recently used share action is floating over the overflow icon. When clicking there, the overflow menu still opens, but it looks pretty shitty:

How did I fix this?

Well I'm done with messing around with this ****, so I just added the showAsAction=never to the share icon. (And yes I saw this, but I get an exception if I do this, also it's another change of the normal lifecycle...)

Feel free to comment if you a know better solution than I used :>

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!