web-dev-qa-db-ja.com

Android)のテキスト選択(WebView内)のデフォルトのコンテキストアクションバーをオーバーライドする

テキスト選択のために、既存のデフォルトのコンテキストアクションバー(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;
        }
    });
27
arun8

私はこれを解決することができました。私もこの問題に直面していて、ウェブ上で解決策を見つけることができませんでした。

したがって、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デバイスでテスト済み。

お役に立てれば。

9
Pulkit Gupta

公式ドキュメント 選択| 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を適用する方法のコード例が含まれています。新しいコンテキストメニューを登録すると、デフォルトメニューが上書きされますが、よくわかりません。現時点ではテストできませんので、問題が解決したかどうか聞いていただければ幸いです。

1
Eric