首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >安卓:无历史的ShareActionProvider

安卓:无历史的ShareActionProvider
EN

Stack Overflow用户
提问于 2012-11-15 18:30:03
回答 4查看 4.3K关注 0票数 8

根据Android文档,如果我不希望我的ShareActionProvider持久化共享历史,我应该调用

代码语言:javascript
运行
复制
mShareActionProvider.setShareHistoryFileName(null)

但是,当我这样做时,我在选择共享选项时遇到以下崩溃:

代码语言:javascript
运行
复制
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的代码:

代码语言:javascript
运行
复制
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;
}

你知道我该怎么解决这个问题吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-12-19 02:47:19

所以最后我不得不通过复制Android源代码中的ShareActionProvider来编写我自己的代码。我还必须复制源代码中的ActivityChooserView和ActivityChooserModel。在操作栏中隐藏默认活动所需的实际修改是在ActivityChooserView的updateAppearance()方法中。它应该是这样的:

代码语言:javascript
运行
复制
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。

票数 8
EN

Stack Overflow用户

发布于 2015-07-17 06:20:44

阅读ActivityChooserModel上的源代码,我发现历史文件是使用Context的openFileInput打开的。只要这个类继续像那样工作,如果你使用那些文件的常用方法删除它,你将能够保持你的历史记录“干净”:

代码语言:javascript
运行
复制
getApplicationContext().deleteFile(SHARE_HISTORY_FILE_NAME);
shareActionProvider.setShareHistoryFileName(SHARE_HISTORY_FILE_NAME);

当选定的应用程序打开时,“最常用”图标显示一段时间,但一旦用户返回到您的应用程序,它就会消失。

如果需要,您还可以删除onShareTargetSelected方法上的文件。

票数 0
EN

Stack Overflow用户

发布于 2016-12-01 03:07:21

我尝试了所有的方法,我使用的是旧的widget.ShareActionProvider (不是compat 7),所以null会导致崩溃,deleteFile肯定会删除,但应用重启后历史记录仍然存在……所以我只发现了一个有用的东西:随机!

代码语言:javascript
运行
复制
    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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13395601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档