Вопрос немного старше, но мне потребовалось некоторое время, чтобы его завершить, так что, возможно, это сэкономит другим время и разочарование. Надеюсь, это поможет ...
Вот что я сделал, чтобы создать динамическое меню, чтобы предлагать все доступные опции для обмена изображениями. Я создал свое собственное топменю вместо использования ActionBar. Мой пункт меню начинается с ImageButton
в onCreate
методе Activity
...
ImageButton shareBtn = (ImageButton)findViewById(R.id.shareBtn);
shareBtn.setOnClickListener(new View.OnClickListener() {
// receive launchables (to build menu items)
List<ResolveInfo> launchables = getLaunchablesToShareWith();
PackageManager pm=getPackageManager();
@Override
public void onClick(View v) {
//Creating the instance of PopupMenu
PopupMenu popup = new PopupMenu(getApplicationContext(), v);
//enable icons using Reflection...
try {
Field[] fields = popup.getClass().getDeclaredFields();
for (Field field : fields) {
if ("mPopup".equals(field.getName())) {
field.setAccessible(true);
Object menuPopupHelper = field.get(popup);
Class<?> classPopupHelper = Class.forName(menuPopupHelper
.getClass().getName());
Method setForceIcons = classPopupHelper.getMethod(
"setForceShowIcon", boolean.class);
setForceIcons.invoke(menuPopupHelper, true);
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
//Inflating the Popup using xml file
popup.getMenuInflater().inflate(R.menu.popupmenu_your_activity, popup.getMenu());
// add items
for (ListIterator<ResolveInfo> iterator = launchables.listIterator(); iterator.hasNext(); ) {
// extract data from launchables
ResolveInfo resolveInfo = iterator.next();
String title = resolveInfo.activityInfo.applicationInfo.loadLabel(pm).toString();
String packageName = resolveInfo.activityInfo.applicationInfo.packageName;
Drawable appIcon = null;
try {
appIcon = pm.getApplicationIcon(packageName);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
continue;
}
// create & add item
popup.getMenu().add(0, 0, 0, title)
.setIcon(appIcon)
.setIntent( getShareIntent().setPackage(packageName) )
.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
prepareImageToShare(true);
startActivity(item.getIntent());
return true;
}
});
}
popup.show();
}
});
Чтобы создать список запускаемых программ:
private List<ResolveInfo> getLaunchablesToShareWith() {
PackageManager pm = getPackageManager();
Intent intent = new Intent(Intent.ACTION_SEND, null);
intent.setType("image/png");
List<ResolveInfo> launchables=pm.queryIntentActivities(intent, 0);
Collections.sort(launchables, new ResolveInfo.DisplayNameComparator(pm));
return launchables;
}
Для создания общего ресурса Intent
:
private Intent getShareIntent() {
// File helper returns something like return Uri.parse("file:///storage/emulated/0/YourApp/output/image.png");
Uri imageUri = FileHelper.getOutputPathAsUri(Files.SHARED_OUTPUT_FILE.getFilename(), Paths.OUTPUT_FOLDER_PATH.getPath(), true);
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setData(imageUri);
shareIntent.setType("image/png");
shareIntent.putExtra(Intent.EXTRA_STREAM, imageUri);
return shareIntent;
}
Файл макета меню ( popupmenu_your_activity.xml ) выглядит следующим образом:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context="your.package.YourActivity" >
<!-- popup menu with dynamic content -->
</menu>