Ответ 1
Хорошо, это решение для незакрепленной иконки общего доступа. Это было неправильное понимание от меня к API.
Я думал, что вы можете относиться к SharedActionProvider-Item
как к любому другому элементу в вашем XML файле меню. Но на самом деле вы не можете. onActionItemClicked
даже не запускается для этого значка, когда он отображается как действие (поэтому он не доступен при добавлении showAsAction=always
). Довольно забавно, событие щелчка запускается, когда значок не отображается, но он отображается в меню переполнения. Это может быть фактическая ошибка в контекстной панели действий!
Теперь я наконец понял, как вы должны запускать SharedActionProvider-Item
:
Вы должны (!) поместить Intent
в метод onCreateActionMode
:
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
, как вы это делали раньше".
Извините, но я не согласен: на самом деле нет смысла устанавливать его здесь. Причина: для меня намерение меняется с каждым дополнительным элементом, который вы проверяете. Он создает файл export-XML для каждого элемента, который вы проверяете, и я действительно не хочу создавать XML файл каждый раз, когда нажимается значок. Это не имеет смысла, и я хочу, чтобы все файлы XML были созданы только тогда, когда пользователь действительно хочет экспортировать элементы.
Итак, в основном я сделал обходной путь для этого. Сначала я создаю Intent
и добавляю пустой List<Uri>
. Этот список сохраняется как переменная-член в моем классе, поэтому, если я добавляю в него элементы, элементы также будут в намерении. Затем, когда пользователь щелкает элемент общего доступа, список заполняется всеми выбранными элементами. Для этого я перевернул OnShareTargetSelectedListener
. Этот метод запускается, когда пользователь нажимает на конкретную цель общего доступа (например, электронную почту, Dropbox и т.д.).
Теперь здесь весь код для этого (метод вызывается только один раз из 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);
}
Надеюсь, ты понимаешь, что я там сделал. Если нет, не стесняйтесь спрашивать.
С учетом всего вышеизложенного одна из моих проблем решена (значок ресурса не доступен для клика, когда отображается как значок), но остальные два остаются открытыми (значки не используют столько места и первой проблемы).
Проблема 2 вида решения:
Похоже, Android нуждается в значках, которые находятся в папках с более высоким разрешением (hdpi, xhdpi), чтобы быть в более высоком разрешении - значок включения/выключения имел только размер 32x32 пикселя (и я просто помещал их во все папки), и поэтому Android сделал какой-то большой беспорядок, поэтому только три значка действительно вписывались в панель действий. Я просто удалил все значки, но оригинальные из 32x32 пикселей в mdpi. Теперь Android расширяет иконки 32x32 пикселей и может отображать пять элементов в панели действий. Это странно.
Проблема 1 вид решены:
Похоже, что это было напрямую связано с проблемой 2, как только я решил проблему 2, значок удаления был помещен непосредственно на панель действий.
Также с некоторым тестированием я увидел, что текст всегда был там, если я добавил значок showAsAction=never
на значок удаления. Я действительно думаю, что это как-то связано с проблемой 2 (значки действительно делали плохие вещи там).
Мои проблемы почти решены.
Я думаю, что теперь у меня появилась (новая) реальная ошибка: последнее действие с общим доступом плавает над значком переполнения. При нажатии там меню переполнения открывается, но выглядит довольно дерьмо:
Как я это исправил?
Ну, я покончил с этим ****, поэтому я просто добавил значок showAsAction=never
к значку общего доступа. (И да, я видел этот, но я получаю исключение, если я это делаю, а также другое изменение нормального жизненного цикла...)
Не стесняйтесь комментировать, если вы знаете лучшее решение, чем я использовал: >