安卓:ShareActionProvider没有历史(Android: ShareActionPro

2019-08-02 18:23发布

按照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;
}

任何想法如何,我可以解决这个问题?

Answer 1:

所以,最后我不得不通过复制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(空)是导致我虽然最初描述的问题。 感谢您的企图答案七。



Answer 2:

阅读ActivityChooserModel我的源代码已经发现,历史文件中使用上下文的openFileInput是开放的。 只要该类保持这样的工作,你将能够保持你的历史“干净”的,如果你使用通常的方法对这些类型的文件,将其删除:

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

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

你也可以删除你的onShareTargetSelected方法的文件,如果需要的话。



Answer 3:

我尝试了所有,我使用的是旧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);


Answer 4:

添加这样的代码:

    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);

}

更多信息请点击这里



Answer 5:

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



文章来源: Android: ShareActionProvider with no history