マルチモードのリストビューでコンテキスト アクション バーを使用しています。
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 メソッドはインテントへの変更を許可しません:
共有ターゲットが選択されたときに呼び出されます。クライアントは、共有が実際に実行される前に、何らかのアクションを実行するかどうかを決定できます。
注: インテントの変更は許可されておらず、インテントへの変更は無視されます。
注: ここでインテントを処理しないでください。このコールバックは、共有が実行されていることをクライアントに通知することを目的としているため、クライアントは必要に応じて 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();
}