Reputation: 1710
I tried to use android.support.v7.widget.ShareActionProvider on actionbar in my app. So I followed the example from android document but got some issues.
Here's my menu xml:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:myapp="http://schemas.android.com/apk/res-auto" >
<item
android:id="@+id/action_share"
android:orderInCategory="100"
android:icon="@drawable/ic_action_share"
android:title="@string/action_share"
myapp:showAsAction="ifRoom"
myapp:actionProviderClass="android.support.v7.widget.ShareActionProvider" />
</menu>
here's my code to create the share action button:
@Override
public void onCreateOptionsMenu (Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.share, menu);
MenuItem shareItem = menu.findItem(R.id.action_share);
ShareActionProvider mShareActionProvider = (ShareActionProvider)MenuItemCompat.getActionProvider(shareItem);
mShareActionProvider.setShareIntent(getDefaultIntent());
super.onCreateOptionsMenu(menu, inflater);
}
My question is:
btw, I checked codes of MenuItemCompat.getActionProvider, it looks like this method will check if the menu item implements SupportMenuItem interface and returns fail if it isn't. How could I deal with it?
Upvotes: 25
Views: 11038
Reputation: 1058
There is another potential related problem. If your MenuItem is always present in the ActionBar, using the following code:
menuItem?.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS)
the resulting Menu item won't work (it will be visible, but not enabled). There are two options, either change the ShowAsAction type or call setShareIntent directly in the onCreateOptionsMenu() function:
[email protected](java.lang.Runnable {
actionProvider.setShareIntent(shareIntent)
})
Upvotes: 0
Reputation: 23154
For Android Pie the action provider class has changed again:
app:actionProviderClass="androidx.appcompat.widget.ShareActionProvider"
Upvotes: 0
Reputation: 5096
If someone wants to keep progaurd
on and still use the code:
ShareActionProvider mShareActionProvider = (ShareActionProvider)MenuItemCompat.getActionProvider(shareItem);
Just need to add to proguard
:
-keep class android.support.v7.widget.ShareActionProvider { *; }
Upvotes: 18
Reputation: 11
You should change the declaration and definition of onCreateOptionsMenu function. you have changed the function declaration from that of the base class. this means the method is not overridden.
Try this :
@Override
public boolean onCreateOptionsMenu (Menu menu) {
inflater.inflate(R.menu.share, menu);// declare a local layout inflater
MenuItem shareItem = menu.findItem(R.id.action_share);
ShareActionProvider mShareActionProvider = (ShareActionProvider)MenuItemCompat.getActionProvider(shareItem);
mShareActionProvider.setShareIntent(getDefaultIntent());
// super.onCreateOptionsMenu(menu, inflater); <--- Remove this line or put in the first line because base class constructor should be called in the first line of the method.
return super.onCreateOptionsMenu(menu);//<-- Add this line to set the menu after adding menu items
}
Upvotes: 0
Reputation: 599
Make sure that your class extends AppCompatActivity instead of just Activity.
Note: Edited to reflect the updated app compat library.
Upvotes: 12
Reputation: 15534
In my case it was wrong namespace in menu.xml
:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/menu_item_share"
app:actionProviderClass="android.support.v7.widget.ShareActionProvider"/>
Pay attention to app:actionProviderClass="android.support.v7.widget.ShareActionProvider"
: it should have
Unfortunatelly, the compiler compiles it without errors, only Android Studio makes notification with underlining.
Upvotes: 20
Reputation: 447
the variable: Android.Support.V7.Widget.ShareActionProvider shareActionProvider;
this.MenuInflater.Inflate(Resource.Menu.share_action_provider, menu);
var shareItem = menu.FindItem(Resource.Id.menu_item_share_action_provider_action_bar);
MenuItemCompat.SetShowAsAction (shareItem, MenuItemCompat.ShowAsActionIfRoom);
var actionprov = new Android.Support.V7.Widget.ShareActionProvider (this);
MenuItemCompat.SetActionProvider (shareItem, actionprov);
var test = MenuItemCompat.GetActionProvider (shareItem);
shareActionProvider = test.JavaCast<Android.Support.V7.Widget.ShareActionProvider>();
var intent = new Intent(Intent.ActionSend);
intent.SetType("text/plain");
intent.PutExtra(Intent.ExtraText, "ActionBarCompat is Awesome! Support Lib v7 #Xamarin");
shareActionProvider.SetShareIntent (intent);
return base.OnCreateOptionsMenu(menu);
this did the trick with me... i just created my own shareactionprovider ! and i set it myself, then get it... and maybe theres some code even thats not needed.. but its a lot of casting AND MAKE SURE you use the right ones all the time, if you just type "ShareActionProvider" you are in fact using V4..! instead of V7
Upvotes: 0
Reputation: 1
Try to add to unit of activity
import android.support.v4.view.MenuItemCompat;
I've had the same problem and it was solution.
Upvotes: 0
Reputation: 761
After some reading and that includes probably some of you responses, finally this issued is solved:
Share_Menu.xml. Make sure you have a custom namespace and the actionProvider class is from that custom namespace as well as the correct value: android.support.v7.widget.ShareActionProvider
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:myapp="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/action_share"
android:title="@string/action_detail_share"
myapp:showAsAction="always"
myapp:actionProviderClass="android.support.v7.widget.ShareActionProvider"></item>
</menu>
Detail_Activity.java
2.1. Inherit from ActionBarActivity instead of Activity
2.2. Add the correct imports
import android.support.v4.app.Fragment;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.ShareActionProvider;
AndroidManifest.xml Add the android:theme="@style/Theme.AppCompat.Light"
<activity
android:name=".detail_activity"
android:label="@string/title_activity_detail_activity"
android:theme="@style/Theme.AppCompat.Light"
android:parentActivityName=".main_activity" >
Build.gradle
4.1. In my case just to stay in the safe side I turn offf ProGuard in Debug.
debug {
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
4.2. Make sure that you have the following compile section in dependencies
`compile 'com.android.support:appcompat-v7:20.0.+'`
Upvotes: 11
Reputation: 299
Here this is the only solution that works to make ShareActionProvider not null...i use set ActionProvider instead...see the code below:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.messages_activity_menu, menu);
MenuItem menuItem = menu.findItem(R.id.menu_item_share);
shareActionProvider = new ShareActionProvider(this);
MenuItemCompat.setActionProvider(menuItem, shareActionProvider);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId() == R.id.menu_item_share){
onShareAction();
}
return super.onOptionsItemSelected(item);
}
private void onShareAction(){
// Create the share Intent
String playStoreLink = "https://play.google.com/store/apps/details?id=" + getPackageName();
String yourShareText = getResources().getString(R.string.share_text) + playStoreLink;
Intent shareIntent = ShareCompat.IntentBuilder.from(this).setType("text/plain").setText(yourShareText).getIntent();
// Set the share Intent
if (shareActionProvider != null) {
shareActionProvider.setShareIntent(shareIntent);
}
}
and...xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/menu_item_share"
android:icon="@drawable/ic_action_share"
android:showAsAction="ifRoom|withText"
android:title="@string/menu_item_share" />
</menu>
and other things that may be checked:
the activity has to extends ActionBarActivity:
MyActivity extends ActionBarActivity
check and use this imports:
import android.support.v4.app.ShareCompat;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBar.OnNavigationListener;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.ShareActionProvider;
In AndroidManifest.xml put this line in your activity's tag attributes:
android:theme="@style/Theme.AppCompat.Light"
If you dont know how to import v7 and v4 compatibility libraries see: http://developer.android.com/tools/support-library/setup.html
Upvotes: 17
Reputation: 1640
I had the same type of error. MenuItemCompat.getActionProvider returned null.
My problem was in ProGuard. Turning ProGuard off solved it for me.
Upvotes: 1
Reputation: 1123
I had the same nullPointer probleme in my app. As @josh527 stated, I forgot to define a custom xml namespace for my application. I know it was not your probleme, but some people may reach your post like me and not see that so I just wanted to spot it ;)
Upvotes: 1