按照Android文档,如果我不希望我的ShareActionProvider坚持那份历史我应该叫
mShareActionProvider.setShareHistoryFileName(null)
我这样做然而,当我坐上选择股票期权下列崩溃:
11-15 10:06:34.848: E/AndroidRuntime(22461): java.lang.IllegalStateException: No preceding call to #readHistoricalData
11-15 10:06:34.848: E/AndroidRuntime(22461): at android.widget.ActivityChooserModel.persistHistoricalDataIfNeeded(ActivityChooserModel.java:573)
11-15 10:06:34.848: E/AndroidRuntime(22461): at android.widget.ActivityChooserModel.addHisoricalRecord(ActivityChooserModel.java:743)
11-15 10:06:34.848: E/AndroidRuntime(22461): at android.widget.ActivityChooserModel.chooseActivity(ActivityChooserModel.java:491)
11-15 10:06:34.848: E/AndroidRuntime(22461): at android.widget.ActivityChooserView$Callbacks.onItemClick(ActivityChooserView.java:547)
下面是树立ShareActionProvider的代码:
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.article_pager_menu, menu);
// mShareActionProvider is a field in the Activity
mShareActionProvider = (ShareActionProvider) menu.findItem(R.id.menu_share)
.getActionProvider();
mShareActionProvider
.setShareHistoryFileName(null);
Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
shareIntent.setType("text/plain");
mShareActionProvider.setShareIntent(shareIntent);
mShareActionProvider.onCreateActionView();
return true;
}
任何想法如何,我可以解决这个问题?
所以,最后我不得不通过复制Android的源找到了一个写我自己的ShareActionProvider。 我也有过ActivityChooserView,并从源头ActivityChooserModel复制。 隐藏在操作栏的缺省活动所需要的实际的修改是在ActivityChooserView的updateAppearance()方法。 这是它应该是什么样子:
private void updateAppearance() {
// Expand overflow button.
if (mAdapter.getCount() > 0) {
mExpandActivityOverflowButton.setEnabled(true);
} else {
mExpandActivityOverflowButton.setEnabled(false);
}
mDefaultActivityButton.setVisibility(View.GONE);
if (mDefaultActivityButton.getVisibility() == VISIBLE) {
mActivityChooserContent.setBackgroundDrawable(mActivityChooserContentBackground);
} else {
mActivityChooserContent.setBackgroundDrawable(null);
}
}
我无法弄清楚,为什么setShareHistoryFileName(空)是导致我虽然最初描述的问题。 感谢您的企图答案七。
阅读ActivityChooserModel我的源代码已经发现,历史文件中使用上下文的openFileInput是开放的。 只要该类保持这样的工作,你将能够保持你的历史“干净”的,如果你使用通常的方法对这些类型的文件,将其删除:
getApplicationContext().deleteFile(SHARE_HISTORY_FILE_NAME);
shareActionProvider.setShareHistoryFileName(SHARE_HISTORY_FILE_NAME);
在“最常用”的图标会显示一段时间,当所选择的应用程序打开,但只要用户回到您的应用程序,它会消失。
你也可以删除你的onShareTargetSelected方法的文件,如果需要的话。
我尝试了所有,我使用的是旧widget.ShareActionProvider(不COMPAT 7),所以空导致崩溃,DELETEFILE肯定删除,但历史上的应用程序重新启动后,始终还是存在,所以,我发现只有一个工作的事情:随意!
String fname=ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME;
try {
fname = prefs.getString("SHARE_HISTORY_FILE_NAME", ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);
getApplicationContext().deleteFile(ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);
fname="SHARE_HISTORY_FILE_NAME"+Math.random()*1000;
SharedPreferences.Editor ed = prefs.edit();
ed.putString("SHARE_HISTORY_FILE_NAME", fname);
ed.commit();
} catch (Exception e) {
Log.e(TAG,"err "+e.toString());
}
mSharedActionProvider.setShareHistoryFileName(fname);
添加这样的代码:
private void addShareSelectedListener() {
if (null == mShareActionProvider) return;
OnShareTargetSelectedListener listener = new OnShareTargetSelectedListener() {
public boolean onShareTargetSelected(ShareActionProvider source, Intent intent) {
mContex.startActivity(intent);
return true;
}
};
//Set to null if share history should not be persisted between sessions.
mShareActionProvider.setShareHistoryFileName(null);
mShareActionProvider.setOnShareTargetSelectedListener(listener);
}
更多信息请点击这里
改性com.actionbarsherlock.widget.ShareActionProvider的onCreateActionView然后调用ActivityChooserModel的方法:setHistoryMaxSize(0)