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 onActionItemClicked
Method 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 :>