根据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;
}
我有什么想法可以解决这个问题吗?
答案 0 :(得分:8)
所以最后我必须通过复制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(null)导致我最初描述的问题。感谢您尝试回答Seven。
答案 1 :(得分:0)
阅读ActivityChooserModel上的源代码我发现历史文件是使用Context的openFileInput打开的。只要那个班级继续这样工作,你就能保持你的历史"清洁"如果你使用通常的方法删除这些类型的文件:
{0}
{0, 1}
{0, 1, 2}
"最常用的"当所选应用程序打开时,图标将显示一段时间,但只要用户回到您的应用程序,它就会消失。
如果需要,您还可以删除onShareTargetSelected方法上的文件。
答案 2 :(得分:0)
我尝试了所有,我正在使用旧的widget.ShareActionProvider(不是compat 7),所以null导致崩溃,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);
答案 3 :(得分:-1)
添加如下代码:
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);
}
更多信息请点击here
答案 4 :(得分:-1)
修改了com.actionbarsherlock.widget.ShareActionProvider的onCreateActionView然后调用ActivityChooserModel的方法:setHistoryMaxSize(0)