Android WebView - слушатель выбора текста в 2018 году - PullRequest
0 голосов
/ 15 ноября 2018

Я создам приложение, в которое пользователь будет вводить URL-адрес веб-сайта моего приложения. Затем я показываю эту страницу в своем приложении, используя WebView.

Как вы знаете, когда пользователь нажимает любой текст в контексте немного длиннее, появляется курсор Android, тогда мы можем выбрать текст столько, сколько мы хотим.

После выбора мы увидим, что «КОПИРОВАНИЕ, ПОДЕЛИТЬСЯ, ВЫБРАТЬ ВСЕ» и т. Д.

Мой вопрос заключается в том, что, когда пользователь выбирает текст, я хочу показать ему различные варианты. Допустим, «MyCOPY, SendTwitter, SendMessage».

Как я могу это сделать?

Что я до сих пор делал?

Я просто создаю панель в верхней части приложения. Но я не хочу этого. I just want to change COPY, SHARE part

Вот код:

private WebView view;
private final String TAG = MainActivity.class.getSimpleName();
private ActionMode actionMode;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    this.view = findViewById(R.id.webView);
    view.loadUrl("https://stackoverflow.com/questions/28385768/android-how-to-check-for-successful-load-of-url-when-using-webview-loadurl");
    view.setWebViewClient(new MyWebViewClient());
    Log.d(TAG, view.getUrl());
    view.setOnLongClickListener((v) -> {
        if (actionMode != null)
            return false;
        actionMode = startSupportActionMode(actionCallBack);
        return true;
    });
}

Где startSupportActionMode (actionCallBack) равно

private ActionMode.Callback actionCallBack = new ActionMode.Callback() {

    @Override
    public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
        actionMode.getMenuInflater().inflate(R.menu.custommenu, menu);
        actionMode.setTitle("Choose");
        return true;
    }

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

    @Override
    public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
        switch (menuItem.getItemId()){
            case R.id.example_item_1:
                Toast.makeText(MainActivity.this, "Option 1 selected", Toast.LENGTH_SHORT).show();
                actionMode.finish();
                return true;
            case R.id.example_item_2 :
                Toast.makeText(MainActivity.this, "Option 2 selected", Toast.LENGTH_SHORT).show();
                actionMode.finish();
                return true;
            default:
                return false;
        }
    }

    @Override
    public void onDestroyActionMode(ActionMode actionMode) {
        actionMode = null;
    }
};

1 Ответ

0 голосов
/ 15 ноября 2018

Вы можете реализовать интерфейс ActionMode.Callback для создания собственного меню при выборе.

Жизненный цикл режима действия выглядит следующим образом:

onCreateActionMode (ActionMode, Menu) один раз при первоначальном создании

onPrepareActionMode (ActionMode, Menu) после создания и каждый раз, когда ActionMode становится недействительным onActionItemClicked (ActionMode, MenuItem) каждый раз, когда нажимается кнопка контекстного действия onDestroyActionMode (ActionMode), когда действиережим закрыт

просто убедитесь, что ваши текстовые представления позволяют выделять текст (android:textIsSelectable="true")

private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() {

    // Called when the action mode is created; startActionMode() was called
    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        // Inflate a menu resource providing context menu items
        MenuInflater inflater = mode.getMenuInflater();
        inflater.inflate(R.menu.context_menu, menu);
        return true;
    }

    // Called each time the action mode is shown. Always called after onCreateActionMode, but
    // may be called multiple times if the mode is invalidated.
    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        return false; // Return false if nothing is done
    }

    // Called when the user selects a contextual menu item
    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menu_share:
                shareCurrentItem();
                mode.finish(); // Action picked, so close the CAB
                return true;
            default:
                return false;
        }
    }

    // Called when the user exits the action mode
    @Override
    public void onDestroyActionMode(ActionMode mode) {
        mActionMode = null;
    }
};

, затем вызовите startActionMode(), чтобы включить контекстный режим действия, когда это необходимо( source ), например, внутри setOnLongClickListener

...