27

テキスト選択のために、既存のデフォルトのコンテキスト アクション バー (CAB) をオーバーライドしたいと考えています。つまり、webview でテキストが選択されたときに、独自のボタンを使用して独自の 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;
        }
    });
4

2 に答える 2

9

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

そのため、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 デバイスでテスト済み。

お役に立てれば。

于 2014-02-07T11:33:07.500 に答える
1

公式ドキュメントの選択 | Android デベロッパーは次のように述べています。

CAB アクションの選択

CAB に表示されるアクションと要素を決定できます。アクション バー パターンのガイドラインを使用して、最上位に表示するアイテムとアクション オーバーフローに移動するアイテムを決定します。

CAB アクションを動的に調整する ほとんどの場合、ユーザーが選択項目に項目を追加すると、CAB のアクションを動的に調整する必要があります。1 つの選択されたデータ項目に適用されるアクションは、必ずしも同じ種類の複数の選択されたデータ項目に適用されるとは限りません。

残念ながら、引用に含まれるリンクは、実際の詳細には触れずに一般的な情報のみを保持するセクションへのリンクです. さらに悪いことに、それはSelection | Android デベロッパーページ。

もう少し調べてみると、Lars Vogel によるこのチュートリアルが見つかりました。私は引用します(私の書式設定):

コンテキスト アクション モードは、特定のサブタスクの期間中ActionBar、アプリケーションをオーバーレイする一時をアクティブにします。ActionBar

通常、コンテキスト アクション モードは、アイテムを選択するか、アイテムを長押しすることでアクティブになります。

これを実装するstartActionMode(には、ビューまたはアクティビティで ) メソッドを呼び出します。このメソッドはActionMode.Callback、コンテキストのライフサイクルを担当するオブジェクトを取得しますActionBar

メソッドViewを介して コンテキスト メニューを に割り当てることもできます。registerForContextMenu(view)ユーザーがビューを「長押し」すると、コンテキスト メニューもアクティブになります。このonCreateContextMenu()メソッドは、コンテキスト メニューが使用後に破棄されるため、コンテキスト メニューがアクティブになるたびに呼び出されます。コンテキスト メニューを使用するよりも、コンテキスト アクション モードを優先する必要があります。

を使用して独自のメニューを作成できることが最も顕著な参考文献に記載されていますregisterForContextMenu(view)。回答を複製するのではなく、J. Pablo Fernándezによるこの回答を見つけました。これには、独自の CAB を適用する方法に関するコード例が含まれています。新しいコンテキスト メニューを登録すると、既定のメニューが上書きされるはずですが、よくわかりません。現時点ではこれをテストできないため、これで問題が解決したかどうかお知らせいただければ幸いです。

于 2013-08-23T11:27:08.213 に答える