我在多模式下使用我的列表视图上的上下文操作栏。
在 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();
}