4

私はよくグーグルで検索し、スタックオーバーフローでいくつかのチュートリアルと回答を見つけましたが、この問題を解決するのにいくつかの困難に直面しています.

WebView を持つ Fragment があり、ユーザーが Web ビューのテキストを選択したときに、カスタム コンテキスト アクション バーを表示したいと考えています。ここには 2 つの主な問題があります。

  • 1 現在、ユーザーが Web ビューの任意の部分で長いクリックを実行すると、カスタム CAB が表示されます。
  • 2 ユーザーが Web ビューの一部のテキストを長押しすると、テキストが選択されません。

私の現在のコードの一部:

カスタム インターフェイス:

public class SelectActionModeCallback implements ActionMode.Callback {

    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        return false;
    }

    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        return false;
    }

    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        return false;
    }

    @Override
    public void onDestroyActionMode(ActionMode mode) {
    }
}

カスタム WebView

public class CustomWebView extends WebView {

    private SelectActionModeCallback actionModeCallback;

    public CustomWebView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public ActionMode startActionMode(Callback callback) {
        actionModeCallback = new SelectActionModeCallback();
        return super.startActionMode(actionModeCallback); 
    }

私のフラグメントでは、これがあります:

@Override
public void onResume() {
    super.onResume();

    myWebView.setOnLongClickListener(new View.OnLongClickListener() {
        public boolean onLongClick(View view) {
            if (mActionMode != null) {
                Toast.makeText(getActivity(), "test", Toast.LENGTH_SHORT).show();
                return false;
            }

            mActionMode = getActivity().startActionMode(mActionModeCallback);
            view.setSelected(true);
            return true;
        }
    });
}

private SelectActionModeCallback mActionModeCallback = new SelectActionModeCallback() {

    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        MenuInflater inflater = mode.getMenuInflater();
        inflater.inflate(R.menu.custom, menu);
        return true;
    }

    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        return false;
    }

    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_sustom:
                customMethod();
                mode.finish();
                return true;
            default:
                return false;
        }
    }

    @Override
    public void onDestroyActionMode(ActionMode mode) {
        mActionMode = null;
    }
};
4

1 に答える 1

3

もっと良い方法があります!次の回答を参照してください: https://stackoverflow.com/a/22391169/2608235


OnLongClickListenerつまり、 を使用して選択範囲を 内に保持する ことはできませんWebView。Android は、 内のテキストを選択するために舞台裏でいくつかの奇妙なことを行いますWebViewsOnLongClickListenerを呼び出すためにオーバーライドするとstartActionMode、既にわかっているように、選択が失われます。

startActionMode代わりにすべきことは、親ではなくフラグメントでオーバーライドすることですView(あなたの場合はCustomWebView)。

この質問を重複としてマークする mod 権限はありませんが、重複しています。
詳細については、私の質問を参照してください: WebView テキスト選択にカスタム コンテキスト アクション バーを使用する

于 2014-04-16T17:02:16.003 に答える