Android 4.0(またはActionBarSherlockを使用している場合は以前のバージョン)で使用可能な新しいShareActionProviderには、最後に使用されたアイテムがアクションバーに表示される機能があります。これをオフにする方法はありますか?
8 に答える
私にとって、履歴アイコンを回避するための最善の解決策は、ShareActionProviderを使用せず、代わりに他のアクションとして作成することです。
<item
android:id="@+id/menu_action_share"
android:showAsAction="ifRoom"
android:icon="@drawable/ic_action_share"
android:title="@string/share"/>
menu / activity_actions.xmlに、ic_action_shareアイコンが付いたアイテムを配置します。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_actions, menu);
return super.onCreateOptionsMenu(menu);
}
メニューを普通に膨らませます...
private void actionShare(){
Intent i = new Intent(Intent.ACTION_SEND);
i.setType("text/plain");
i.putExtra(Intent.EXTRA_SUBJECT, "my string");
i.putExtra(Intent.EXTRA_TEXT, "another string");
startActivity(i);
//Or like above will always display the chooser
//startActivity(Intent.createChooser(i, getResources().getText(R.string.share)));
}
ACTION_SENDインテントを使用してメソッドを作成します
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_item_share:
actionShare();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
そして最後に、onOptionsItemSelectedからこのメソッドを呼び出します
詳細->他のアプリへの簡単なデータの送信
自分で共有アクティビティを開始します。
shareActionProvider.setShareIntent(intent);
shareActionProvider.setOnShareTargetSelectedListener(this);
@Override
public boolean onShareTargetSelected(ShareActionProvider source, Intent intent) {
// start activity ourself to prevent search history
context.startActivity(intent);
return true;
}
その場合、ShareActionProviderは、選択したアクティビティを共有履歴に追加しません。
私はShareActionProvider(およびサポートクラス)の独自のバージョンを作成しました。それらをプロジェクトにコピーできます(https://gist.github.com/saulpower/10557956)。これにより、履歴をオフにする機能が追加されるだけでなく、共有するアプリをフィルタリングすることもできます(パッケージ名がわかっている場合)。
private final String[] INTENT_FILTER = new String[] {
"com.twitter.android",
"com.facebook.katana"
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.journal_entry_menu, menu);
// Set up ShareActionProvider's default share intent
MenuItem shareItem = menu.findItem(R.id.action_share);
if (shareItem instanceof SupportMenuItem) {
mShareActionProvider = new ShareActionProvider(this);
mShareActionProvider.setShareIntent(ShareUtils.share(mJournalEntry));
mShareActionProvider.setIntentFilter(Arrays.asList(INTENT_FILTER));
mShareActionProvider.setShowHistory(false);
((SupportMenuItem) shareItem).setSupportActionProvider(mShareActionProvider);
}
return super.onCreateOptionsMenu(menu);
}
これを行うためのAPIはありません。ShareActionProvider
ただし、クラスは非常に単純であり、履歴を保持しない独自のバージョンを非常に簡単に作成できます。他の順序付け手段(アルファベット順など)を使用して、可能なターゲットの並べ替え順序を決定する必要があります。
明確化のポイント:スライディングウィンドウ期間全体で、これは「最後に使用された」ではなく、「最も頻繁に使用された」ものです。
履歴を使用したくない場合は、ビューを作成する前に、
yourShareActionProvider.setShareHistoryFileName(null);
公式ドキュメント(強調鉱山)からのこのメソッドの説明:
共有ターゲットの順序付けに使用される共有履歴を永続化するためのファイルのファイル名を設定します。このファイルは、onCreateActionView()によって作成されたすべてのビューに使用されます。デフォルトはDEFAULT_SHARE_HISTORY_FILE_NAMEです。セッション間で共有履歴を保持しない場合は、nullに設定します。
編集:明確にする必要があります—履歴がない場合、「最も頻繁に使用される」アイテムは表示されないため、現在、これがそのボタンを削除する唯一の方法です。
chooserView.getDataModel().setHistoryMaxSize(0);
今日は2年前ですが、カスタムShareActionProviderクラスを作成し、この行をonCreateActionView()内に追加して、すべての魔法をかけたときの経験を共有したいと思います。..LollipopデバイスとAPI16エミュレーターデバイスでテストしましたが、完全に機能します。これが私のカスタムクラスです:
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.support.v7.internal.widget.ActivityChooserView;
import android.support.v7.widget.ShareActionProvider;
import android.view.View;
public class MyShareActionProvider extends ShareActionProvider {
/**
* Creates a new instance.
*
* @param context Context for accessing resources.
*/
public MyShareActionProvider(Context context) {
super(context);
}
@Override
public View onCreateActionView() {
ActivityChooserView chooserView = (ActivityChooserView) super.onCreateActionView();
Drawable icon;
if (Build.VERSION.SDK_INT >= 21) {
icon = getContext().getDrawable(R.drawable.share_icon);
}else{
icon = getContext().getResources().getDrawable(R.drawable.share_icon);
}
chooserView.setExpandActivityOverflowButtonDrawable(icon);
chooserView.getDataModel().setHistoryMaxSize(0);
return chooserView;
}
}
次のようなコードを追加します。
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);
}
getSupportMenuInflater().inflate(R.menu.share_action_provider, menu);
// Set file with share history to the provider and set the share intent.
MenuItem actionItem = menu.findItem(R.id.menu_item_share_action_provider_action_bar);
ShareActionProvider actionProvider = (ShareActionProvider) actionItem.getActionProvider();
***actionProvider.setShareHistoryFileName(null);
OnShareTargetSelectedListener listener = new OnShareTargetSelectedListener() {
public boolean onShareTargetSelected(ShareActionProvider source, Intent intent) {
startActivity(intent);
return true;
}
};
actionProvider.setOnShareTargetSelectedListener(listener);***