设备方向上可用的共享意图列表菜单已更改(shareActionProvider)

时间:2013-02-25 22:01:03

标签: android android-intent shareactionprovider

经过几个小时的调查并试图找到解决方案后,我决定在这里写下我的问题,也许其他人也面对它并找到了解决方法。 我有一个带菜单的应用程序,其中一个选项是共享选项,在菜单xml文件中声明如下:

<item android:id="@+id/menu_share"
          android:actionProviderClass="android.widget.ShareActionProvider"
          android:title="Share"/>

onOptionsItemSelected方法中,我创建并设置了共享意图:

private ShareActionProvider shareActionProvider;
@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menu_share:
                MenuItem actionItem = optionsMenu.findItem(R.id.menu_share);
                shareActionProvider = (ShareActionProvider) actionItem.getActionProvider();
                shareActionProvider.setShareIntent(createShareIntent());
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

按Share(共享)菜单选项时,将显示包含要共享的应用程序的列表。 enter image description here 我想要的是当我旋转列表可见的设备,而不是消失。要提到我不能使用android:configChanges来阻止重新创建活动。

我首先想看看如何以编程方式打开该共享应用列表。

A)。调用以下方法没有任何视觉发生;它只是更新了ShareActionProvider

public void showShareItemList() {
    MenuItem actionItem = optionsMenu.findItem(R.id.menu_share);
    shareActionProvider = (ShareActionProvider) actionItem.getActionProvider();
    shareActionProvider.setShareIntent(createShareIntent());
}

B)。调用以下方法会打开一个新活动 - 但不会显示如上图所示的菜单选项列表。

public void showShareItemList2(){
        Intent sharingIntent = new Intent();
        sharingIntent.setAction(Intent.ACTION_SEND);
        sharingIntent.setType("text/plain");
        sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Subject Here");
        startActivity(Intent.createChooser(sharingIntent, "Share"));
    }

结果: enter image description here

c)。以下方法只打开菜单选项:

public void showShareItemList3() {
    openOptionsMenu(); // programmatically open the options menu
}

那么,有没有办法以编程方式打开应用程序的共享项列表?或者至少有一种方法可以通过编程方式按菜单键(=以编程方式选择一个菜单项)?

另一个问题是我怎么知道在更改方向时共享列表是否可见?

为此,我使用boolean变量private boolean isShareOptionMenuListVisible = false;,我将其保存在方法onSaveInstanceState()上,并在onCreate()方法中将其恢复。 我按下Share项时会生成isShareOptionMenuListVisible = true,但是当我看不到它时,我找不到将其设为false的方法。 使用覆盖方法onOptionsMenuClosed对我没有帮助,因为每当关闭选项菜单时都会调用(这是在文档中,即使我可以说这不是真实的,因为在我的应用程序永远不会被调用),我想知道何时关闭共享应用程序选项菜单。

以下是一个示例项目,展示了上述所有问题:project link

欢迎任何帮助!感谢。

1 个答案:

答案 0 :(得分:1)

如果您使用的是SDK 11或更高版本,则可以在显示(或任何)操作项目菜单时注册接收回调,包括您的ShareActionProvider:

getActionBar().addOnMenuVisibilityListener(new ActionBar.OnMenuVisibilityListener() {

    @Override
    public void onMenuVisibilityChanged(boolean isVisible) {
        ...
    }

});

ActionBarSherlock也支持此方法,但由于某种原因,实际上从未调用过侦听器。