经过几个小时的调查并试图找到解决方案后,我决定在这里写下我的问题,也许其他人也面对它并找到了解决方法。 我有一个带菜单的应用程序,其中一个选项是共享选项,在菜单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(共享)菜单选项时,将显示包含要共享的应用程序的列表。
我想要的是当我旋转列表可见的设备,而不是消失。要提到我不能使用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"));
}
结果:
c)。以下方法只打开菜单选项:
public void showShareItemList3() {
openOptionsMenu(); // programmatically open the options menu
}
那么,有没有办法以编程方式打开应用程序的共享项列表?或者至少有一种方法可以通过编程方式按菜单键(=以编程方式选择一个菜单项)?
另一个问题是我怎么知道在更改方向时共享列表是否可见?
为此,我使用boolean
变量private boolean isShareOptionMenuListVisible = false;
,我将其保存在方法onSaveInstanceState()
上,并在onCreate()
方法中将其恢复。
我按下Share项时会生成isShareOptionMenuListVisible = true
,但是当我看不到它时,我找不到将其设为false的方法。
使用覆盖方法onOptionsMenuClosed
对我没有帮助,因为每当关闭选项菜单时都会调用“(这是在文档中,即使我可以说这不是真实的,因为在我的应用程序永远不会被调用),我想知道何时关闭共享应用程序选项菜单。
以下是一个示例项目,展示了上述所有问题:project link。
欢迎任何帮助!感谢。
答案 0 :(得分:1)
如果您使用的是SDK 11或更高版本,则可以在显示(或任何)操作项目菜单时注册接收回调,包括您的ShareActionProvider:
getActionBar().addOnMenuVisibilityListener(new ActionBar.OnMenuVisibilityListener() {
@Override
public void onMenuVisibilityChanged(boolean isVisible) {
...
}
});
ActionBarSherlock也支持此方法,但由于某种原因,实际上从未调用过侦听器。