Невозможно передать Поставщик действия поставщику действия
Ниже приведен код моей активности
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.ShareActionProvider;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends Activity {
private ShareActionProvider shareAction;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
MenuItem item = menu.getItem(R.id.menu_settings);
shareAction = (ShareActionProvider) item.getActionProvider();
return true;
}
}
Проблема заключается в том, что в ActionProvider есть личная ошибка для ShareActionProvider.Почему это так
ниже - activity_menu.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/menu_settings"
android:orderInCategory="100"
android:showAsAction="always"
android:title="@string/menu_settings"
android:actionProviderClass="android.widget.ShareActionProvider"
/>
</menu>
Ответы
Ответ 1
У меня была та же проблема, и я нашел решение:
1) Вы должны использовать:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:bwq="http://schemas.android.com/apk/res-auto" >
<item
android:id="@+id/menu_share"
android:title="@string/menu_share"
bwq:actionProviderClass="android.support.v7.widget.ShareActionProvider"
bwq:showAsAction="always"/>
</menu>
2) и в Java
import android.support.v7.widget.ShareActionProvider;
и
// Locate MenuItem with ShareActionProvider
MenuItem item = menu.findItem(R.id.menu_share);
// Fetch and store ShareActionProvider
mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(item);
Ответ 2
меню:
<item
android:id="@+id/action_share"
android:title="@string/action_share"
app:showAsAction="ifRoom"
app:actionProviderClass="android.support.v7.widget.ShareActionProvider"/>
Java:
MenuItem menuItem = menu.findItem(R.id.action_share);
mActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(menuItem);
Ответ 3
Вы используете android.widget.ShareActionProvider
, который предназначен для панели действий API уровня 11+. Если вы используете вспомогательный порт AppCompat на панели действий, вам нужно вместо этого использовать android.support.v7.widget.ShareActionProvider
.
Ответ 4
Я столкнулся с этой проблемой, следуя андровому файлу action android dev, который в основном является тем, что вы делаете. После того, как вы пробрались в образцы, которые используют панель действий, используя обратные совместимые библиотеки поддержки v7 и v4, я закончил использование следующего кода для onCreateOptionsMenu().
@Override
public boolean onCreateOptionsMenu(Menu menu) {
File file = new File(mFilePath);
ShareCompat.IntentBuilder b = ShareCompat.IntentBuilder.from(this)
.setType("image/png")
.setStream(Uri.fromFile(file));
MenuItem item = menu.add("Share");
ShareCompat.configureMenuItem(item, b);
MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
return true;
}
Несколько вещей, чтобы отметить здесь, это то, что вы не надуваетесь из ресурса меню. В меню добавлена кнопка совместного использования по умолчанию. Вам просто нужно указать, какой тип ресурса вы используете с .setType. Поскольку я делюсь файлом, мне нужно setStream, с Uri.fromFile(new File()); Если вы делились текстом, вы бы установилиType ( "text/plain" ).
Также убедитесь, что вы импортировали проект $SDK\extras\android\support\v7\appcompat library, который содержит необходимые пакеты. Кроме того, поскольку они импортировали этот проект библиотеки, вашему проекту не нужен v4support.jar в папке libs, потому что проект библиотеки уже имеет его.
Ответ 5
Проблема заключалась в том, что то, что @CommonsWare говорило о том, что не использует библиотеку поддержки ShareActionProvider, и даже если бы я это сделал, то это также не сработало, потому что при использовании библиотеки поддержки нам нужны пользовательские префиксы для некоторых действий, таких как showAsAction
Ответ 6
Следуйте простому правилу, которое я нашел полезным
С AppCompatActivity
используйте это,
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:support="http://schemas.android.com/apk/res-auto">
<!--
To use ShareActionProvider, we reference the class by set the
support:actionProviderClass attribute with the full class name of ShareActionProvider.
-->
<item
android:id="@+id/menu_share"
android:title="@string/menu_share"
support:actionProviderClass="android.support.v7.widget.ShareActionProvider"
support:showAsAction="always" />
</menu>
Вы также можете заменить support: actionProviderClass на app: actionProviderClass и support: showAsAction на app: showAsAction
В вашем onCreateOptionsMenu()
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu resource
getMenuInflater().inflate(R.menu.main_menu, menu);
// Retrieve the share menu item
MenuItem shareItem = menu.findItem(R.id.menu_share);
// Now get the ShareActionProvider from the item
mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(shareItem);
//set its ShareIntent.
setShareIntent(shareIntent);
return super.onCreateOptionsMenu(menu);
}
С Activity
используйте это,
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/share"
android:actionProviderClass="android.widget.ShareActionProvider"
android:showAsAction="ifRoom"
tools:ignore="MenuTitle" />
</menu>
В вашем onCreateOptionsMenu()
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.actions, menu);
ShareActionProvider share=
(ShareActionProvider)menu.findItem(R.id.share)
.getActionProvider();
share.setShareIntent(shareIntent);
return(super.onCreateOptionsMenu(menu));
}
Ответ 7
Ни одно из решений здесь не решило мою проблему с ShareActionProvider, не приводя/не возвращая null. В итоге я заменил ShareActionProvider на Intent.SEND_ACTION, чтобы делиться изображениями в моем приложении, как показано в учебнике по Android для разработчиков: https://developer.android.com/training/sharing/send
Хотя Google упоминает в этом руководстве, что: Note: The best way to add a share action item to an ActionBar is to use ShareActionProvider, which became available in API level 14. ShareActionProvider is discussed in the lesson about Adding an Easy Share Action.
Я нашел гораздо проще реализовать только Intention.SEND_ACTION. Не уверен, есть ли другие причины для реализации ShareActionProvider...
Ответ 8
Это было задано несколько лет назад, поэтому существующие ответы, вероятно, работали тогда. Однако на момент написания этой статьи предлагаемый код выдает много предупреждений об устаревании, и это не решает проблему.
В конце концов я решил проблему, и она нигде не была задокументирована в Интернете (что я смог найти), поэтому, надеюсь, этот ответ поможет людям, которые в настоящее время сталкиваются с этой же проблемой.
Решение для меня было в заявлении на импорт. Когда я впервые использовал SharedActionProvider, Android Studio может автоматически добавлять импорт. Он предоставляет две опции для импорта: android.widget.ShareActionProvider
и androidx.appcompat.widget.ShareActionProvider
.
Первый нарушается и приводит к ошибке о том, что приведение никогда не будет успешным. Последнее заставит все работать правильно. app:ActionProviderClass
в файле меню должен совпадать с именем импортируемого файла.