无法单击ActionBar上的MenuItem

时间:2015-03-01 16:49:08

标签: android android-actionbar share menuitem shareactionprovider

我正在尝试实现共享图像的共享意图。我有一个全屏活动,它扩展了ActionBarActivity和一个实现沉浸式模式的片段,正如Android开发人员指南所解释的那样,因此用户可以全屏查看图像。问题是,即使我可以在ActionBar上看到共享图标,它似乎也无法被点击,显然是因为永远不会调用onOptionsItemSelected方法。

以下是onCreateOptionsMenu:

@Override
public boolean onCreateOptionsMenu(Menu menu) {  
    getMenuInflater().inflate(R.menu.menu_share, menu);
    return true;
}

onOptionsItemSelected:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle presses on the action bar items
    switch (item.getItemId()) {
        case R.id.menu_share:
            Intent i = getIntent();
            uriString = i.getStringExtra("uri");
            if(uriString != null) {
                Uri uri = Uri.parse(uriString);

                mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(item);
                mShareActionProvider.setShareIntent(createShareIntent(uri));
            }
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

以下是我为准备和启动意图而创建的方法:

private Intent createShareIntent(Uri uri) {
    Intent shareIntent = new Intent();
    shareIntent.setAction(Intent.ACTION_SEND);
    shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
    shareIntent.setType("image/*");
    startActivity(Intent.createChooser(shareIntent, getResources().getText(R.string.share_image)));
    return shareIntent;
}

menu_share.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/menu_share"
        android:title="Share"
        app:showAsAction="ifRoom"
        android:icon="@drawable/abc_ic_menu_share_mtrl_alpha"
        app:actionProviderClass="android.support.v7.widget.ShareActionProvider"
        />
</menu>

我尝试了不同的方法,例如使用setOnMenuItemClickListener或考虑听众的类似事情,但我发现在调试时会忽略这些侦听器。我也在这里和其他网站上寻找解决方案,但我无法解决这个问题,所以任何想法都将受到赞赏。 提前谢谢!

2 个答案:

答案 0 :(得分:2)

你正在给错误的菜单充气。由于您的菜单文件名为menu.xml,因此您应该执行

getMenuInflater().inflate(R.menu.menu, menu); 

你不要直接夸大条目,而是菜单。

也低于你的

switch (item.getItemId()) {
    case R.id.menu_share:

写:Log.d("mytag", "share menu clicked");然后你可以在你的android logcat中验证单击菜单没有问题,但是你收到的是Intent。

答案 1 :(得分:0)

最终,我改变了解决问题的方法,现在我可以调用onOptionsItemSelected(MenuItem item)方法并将我的应用中的图像分享给其他人。我把代码放在下面。

onCreateOptionsMenu(菜单菜单):

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);

    menuItem = menu.add(Menu.NONE, R.id.action_share, Menu.NONE, R.string.action_share);
    menuItem.setIcon(R.drawable.abc_ic_menu_share_mtrl_alpha);
    menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
    mShareActionProvider = new ShareActionProvider(this);
    return true;
}

onOptionsItemSelected(MenuItem item):

@Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {

            case R.id.action_share:
                Intent i = getIntent();
                uriString = i.getStringExtra("uri");

                if (uriString != null) {
                    Uri uri = Uri.parse(uriString);

                    MenuItemCompat.setActionProvider(item, mShareActionProvider);
                    createShareIntent(uri);
                    return true;
                }
            default:
                return super.onOptionsItemSelected(item);
        }
    }

点击右侧菜单项时创建共享意图的方法:

private void createShareIntent(Uri uri) {
    Intent shareIntent = new Intent();
    shareIntent.setAction(Intent.ACTION_SEND);
    shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
    shareIntent.setType("image/*");
    if (mShareActionProvider != null) {
        mShareActionProvider.setShareIntent(shareIntent);
    }

}

该项目的ID位于values文件夹中的 ids.xml

<?xml version="1.0" encoding="utf-8"?>
    <resources>
        <item type="id" name="action_share"/>
    </resources>

<强> 的strings.xml:

<!-- Actions -->
    <string name="action_share">Share image</string>

正如您所看到的,我不再使用getMenuInflater().inflate(int menuRes, Menu menu),但我使用add()方法生成我的菜单,它对我有用。