1

我在多模式下使用我的列表视图上的上下文操作栏。

在 CAB 的 onCreateActionMode 期间,我初始化了 ShareActionProvider。这是相应的片段:

private class modeCallback implements ListView.MultiChoiceModeListener {

    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        getMenuInflater().inflate(R.menu.contextual_history_detail, menu);
        // Set up ShareActionProvider's default share intent
        MenuItem shareItem = menu.findItem(R.id.action_share);
        mShareActionProvider = (ShareActionProvider) shareItem.getActionProvider();
        shareAction();
        return true;
    }

shareAction 方法:

public void shareAction() {

    sb = new StringBuilder();

    SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(History_DetailActivity.this);
    String shareMessageHeader = sharedPref.getString("pref_dialog_share_header_default_value", getString(R.string.pref_dialog_share_header_default_value));

    sb.append(shareMessageHeader);
    sb.append(System.getProperty("line.separator"));

    for (long id : checkedIDs) {

        Cursor cursor2 = dbHelper.getWork(id);
        if (cursor2 != null && cursor2.getCount() > 0 && !cursor2.isClosed()) {
            sb.append(cursor2.getString(cursor2.getColumnIndex(Consts.colWerkUren_Date)) + " ");
            sb.append(cursor2.getString(cursor2.getColumnIndex(Consts.colWerkUren_Werkbon)) + " ");
            sb.append(cursor2.getString(cursor2.getColumnIndex(Consts.colWerkUren_Type)) + " ");
            sb.append(cursor2.getString(cursor2.getColumnIndex(Consts.colWerkUren_Comment)) + " ");
            sb.append(System.getProperty("line.separator"));
        }

        cursor2.close();
    }

    Intent shareIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);
    shareIntent.setType("text/plain");
    shareIntent.putExtra(Intent.EXTRA_TEXT, sb.toString());
    mShareActionProvider.setShareIntent(shareIntent);

}

如果我这样使用它,则 StringBuilder 变量 sb 会更新,但 ShareActionProvider Intent 不会。我尝试使用此处定义的方法:https : //stackoverflow.com/a/16281251/2119391 但是根据文档,onShareTargetSelected 方法不允许对 Intent 进行任何更改:

在选择共享目标时调用。客户端可以在实际执行共享之前决定是否执行某些操作。

注意:不允许修改意图,对后者的任何更改都将被忽略。

注意:您不应该在这里处理意图。此回调旨在通知客户端正在执行共享,因此客户端可以在必要时更新 UI。

由于 onCreateActionMode 方法中的共享意图(以及额外的意图)的初始化,导致在共享时 StringBuilder sb 不是最新的。

我通过非常丑陋(但有效)的代码暂时解决了这个问题:在 MultiChoiceModeListener 的 modeCallback 中调用 onItemCheckedStateChanged 中的共享意图的初始化。

代码片段:

    @Override
    public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {

        if (checked) {
            checkedIDs.add(id);
            selCount++;
        } else {
            checkedIDs.remove(id);
            selCount--;
        }

        // invalidate the CAB to be able to hide and show menu items
        mode.invalidate();

        // TODO Very dirty way of using the share action provider
        // Is being called every change of a checked list view row
        // Otherwise the share intent isn't up to date
        shareAction();
    }
4

0 回答 0