【问题标题】:Android: ShareActionProvider with no historyAndroid:没有历史记录的 ShareActionProvider
【发布时间】:2012-11-15 10:30:03
【问题描述】:

根据 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 android-intent android-actionbar shareactionprovider


    【解决方案1】:

    所以最后我不得不通过复制在 Android 源代码中找到的 ShareActionProvider 来编写自己的 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) 会导致我最初描述的问题。感谢您尝试回答七。

    【讨论】:

    • 你是如何扩展作为 Singleton 的 ActivityChooserModel 的?
    • 就像一个魅力,只是不要忘记在这些文件中更改必要的导入
    • 太棒了!我已经搞砸了一段时间了,这很好用。
    • @AmerHadi ActivityChooserView 类中的 ActivityChooserViewAdapter 实例。
    【解决方案2】:

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

    getApplicationContext().deleteFile(SHARE_HISTORY_FILE_NAME);
    shareActionProvider.setShareHistoryFileName(SHARE_HISTORY_FILE_NAME);
    

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

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

    【讨论】:

    • 奇怪,但不起作用,即使 deleteFile 返回 true。正如我上面回答的那样,使用随机文件名使其工作
    【解决方案3】:

    我尝试了所有,我使用的是旧的 widget.ShareActionProvider(不是兼容 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);
    

    【讨论】:

      【解决方案4】:

      修改com.actionbarsherlock.widget.ShareActionProvider的onCreateActionView然后调用ActivityChooserModel的方法:setHistoryMaxSize(0)

      【讨论】:

      • OP 不是在谈论操作栏 sherlock 的用法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-04
      • 2020-11-20
      • 2014-06-10
      • 2011-06-06
      • 1970-01-01
      • 2015-01-31
      • 2011-10-29
      相关资源
      最近更新 更多