テキスト選択のために、既存のデフォルトのコンテキストアクションバー(CAB)を上書きしたいと思います。つまり、Webビューでテキストが選択されたときに、独自のボタンを使用して独自のCABを表示したいと思います。 Androidドキュメントを使用してCABを実装しようとしました。OnLongClickListenerはWebビューでテキスト選択イベントをキャプチャしません。テキスト選択をキャプチャするイベントは何ですか?デフォルトのCABを非表示にすることは可能ですか?テキスト選択にCABを表示しますか?
childWebView.setOnLongClickListener(new OnLongClickListener() {
@Override
// Called when the user long-clicks on someView
public boolean onLongClick(View view) {
if (mActionMode != null) {
return false;
}
// Start the CAB using the ActionMode.Callback defined above
mActionMode = startActionMode(mActionModeCallback);
view.setSelected(true);
return true;
}
});
私はこれを解決することができました。私もこの問題に直面していて、ウェブ上で解決策を見つけることができませんでした。
したがって、LongClickリスナーを設定すると、Webviewは選択をまったく表示しなくなります。 Webviewコードを深く掘り下げた後、WebViewのメソッドstartRunModeを呼び出し、SelectActionCallbackModeクラスのインスタンスを渡していることがわかりました。
Webviewクラスを拡張し、次のようにstartRunModeメソッドをオーバーライドしただけです。
public ActionMode startActionMode(ActionMode.Callback callback)
{
actionModeCallback = new CustomizedSelectActionModeCallback();
return super.startActionMode(actionModeCallback);
}
これにより、Webviewは、Webviewのデフォルトのコールバックを表示する代わりに、コールバックを表示するように強制されました。これにより、選択が以前と同じようにスムーズに機能し、選択が行われるたびにCABが表示されました。唯一の注意点は、CABを自分で却下するためのコードを作成する必要があるということでした。
4.1、4.2、および4.3デバイスでテスト済み。
お役に立てれば。
公式ドキュメント 選択| Android開発者 は次のように述べています:
CABアクションの選択
CABに表示するアクションと要素を決定できます。 アクションバーパターン のガイドラインを使用して、トップレベルに表示するアイテムと、アクションオーバーフローに移動するアイテムを決定します。
CABアクションを動的に調整するほとんどの場合、ユーザーが選択範囲に項目を追加すると、CABのアクションを動的に調整する必要があります。単一の選択されたデータ項目に適用されるアクションは、必ずしも同じ種類の複数の選択されたデータ項目に適用されるとは限りません。
残念ながら、引用に含まれているリンクは、実際には詳細に立ち入ることなく、一般的な情報のみを保持しているセクションにリンクしています。さらに悪いことに、それは 選択| Android開発者 ページにリンクします。
もう少し見てみると、Lars Vogelから このチュートリアル が見つかりました。私は引用します(私のフォーマット):
コンテキストアクションモードは、特定のサブタスクの期間中、アプリケーション
ActionBar
をオーバーレイする一時的なActionBar
をアクティブにします。コンテキストアクションモードは通常、アイテムを選択するか、アイテムを長押しすることでアクティブになります。
これを実装するには、ビューまたはアクティビティで_
startActionMode(
_)メソッドを呼び出します。このメソッドは、コンテキストActionBar
のライフサイクルを担当する_ActionMode.Callback
_オブジェクトを取得します。
registerForContextMenu(view)
メソッドを介してコンテキストメニューをView
に割り当てることもできます。ユーザーがビューを「長押し」すると、コンテキストメニューもアクティブになります。onCreateContextMenu()
メソッドは、コンテキストメニューが使用後に破棄されるため、コンテキストメニューがアクティブ化されるたびに呼び出されます。コンテキストメニューの使用よりもコンテキストアクションモードを優先する必要があります。
最も著名な参考文献は、registerForContextMenu(view)
を使用して独自のメニューを作成できると述べています。答えを複製するのではなく、 この答え by J.PabloFernández を見つけました。これには、独自のCABを適用する方法のコード例が含まれています。新しいコンテキストメニューを登録すると、デフォルトメニューが上書きされますが、よくわかりません。現時点ではテストできませんので、問題が解決したかどうか聞いていただければ幸いです。