Включить longClick в WebView - PullRequest
       22

Включить longClick в WebView

13 голосов
/ 10 августа 2010

В браузере вы можете долго нажимать на URL. В моем WebView вы не можете. Как я могу сделать это, чтобы вы могли?

Ответы [ 4 ]

25 голосов
/ 10 августа 2010

У меня была такая же проблема.

К сожалению, я не смог найти способ отображения стандартных опций меню браузера. Вы должны реализовать каждый самостоятельно. Что я сделал, так это зарегистрировал WebView для контекстных меню с activity.registerForContextMenu(webView). Затем я создал подкласс WebView и переопределил этот метод:

@Override
protected void onCreateContextMenu(ContextMenu menu) {
    super.onCreateContextMenu(menu);

    HitTestResult result = getHitTestResult();

    MenuItem.OnMenuItemClickListener handler = new MenuItem.OnMenuItemClickListener() {
        public boolean onMenuItemClick(MenuItem item) {
                // do the menu action
                return true;
        }
    };

    if (result.getType() == HitTestResult.IMAGE_TYPE ||
            result.getType() == HitTestResult.SRC_IMAGE_ANCHOR_TYPE) {
        // Menu options for an image.
        //set the header title to the image url
        menu.setHeaderTitle(result.getExtra());
        menu.add(0, ID_SAVEIMAGE, 0, "Save Image").setOnMenuItemClickListener(handler);
        menu.add(0, ID_VIEWIMAGE, 0, "View Image").setOnMenuItemClickListener(handler);
    } else if (result.getType() == HitTestResult.ANCHOR_TYPE ||
            result.getType() == HitTestResult.SRC_ANCHOR_TYPE) {
        // Menu options for a hyperlink.
        //set the header title to the link url
        menu.setHeaderTitle(result.getExtra());
        menu.add(0, ID_SAVELINK, 0, "Save Link").setOnMenuItemClickListener(handler);
        menu.add(0, ID_SHARELINK, 0, "Share Link").setOnMenuItemClickListener(handler);
    }
}

Если вы хотите сделать что-то кроме контекстного меню, используйте OnLongClickListener. Однако, если вы хотите перехватить событие длинного щелчка, ключом является HitTestResult. Это то, что позволит вам выяснить, на что нажал пользователь, и что-то с ним сделать.

На самом деле я не реализовал "Сохранить ссылку" сам, я просто включил его в качестве примера здесь. Но для этого вам придется делать всю обработку самостоятельно; вам нужно будет сделать запрос HTTP GET, получить ответ, а затем сохранить его где-нибудь на SD-карте пользователя. Я не знаю, как напрямую вызвать загрузку приложения браузера. Ваш код "Сохранить ссылку" будет выглядеть примерно так:

HitTestResult result = getHitTestResult();
HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet(result.getExtra());
HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
if (entity != null) {
    URL url = new URL(result.getExtra());

    //Grabs the file part of the URL string
    String fileName = url.getFile();

    //Make sure we are grabbing just the filename
    int index = fileName.lastIndexOf("/");
    if(index >= 0)
            fileName = fileName.substring(index);

    //Create a temporary file
    File tempFile = new File(Environment.getExternalStorageDirectory(), fileName);
    if(!tempFile.exists())
            tempFile.createNewFile();

    InputStream instream = entity.getContent();
    BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
    //Read bytes into the buffer
    ByteArrayBuffer buffer = new ByteArrayBuffer(50);
    int current = 0;
    while ((current = bufferedInputStream.read()) != -1) {
            buffer.append((byte) current);
    }

    //Write the buffer to the file
    FileOutputStream stream = new FileOutputStream(tempFile);
    stream.write(buffer.toByteArray());
    stream.close();
}
6 голосов
/ 10 августа 2010

Я думаю, вы могли бы использовать что-то вроде этого:

WebView yourWebView;
yourWebView.setLongClickable(true);
yourWebView.setOnLongClickListener(...);

Это должно позволить вам ловить длинные клики на представлении. Что вы делаете после этого ... это зависит от вас!

1 голос
/ 10 августа 2010

Я бы включил Javascript в веб-просмотре.Затем используйте onMouseDown () и onMouseUp (), чтобы определить длительность щелчка.

Вы также можете создавать всплывающие меню в Javascript (не стандартные меню, а свои).

Наконец, выможет взаимодействовать между Javascript и вашим кодом Android / Java.

Пример простого взаимодействия между Javascript и приложением Android.

http://code.google.com/p/apps-for-android/source/browse/trunk/Samples/WebViewDemo/assets/demo.html

http://code.google.com/p/apps-for-android/source/browse/trunk/Samples/WebViewDemo/src/com/google/android/webviewdemo/WebViewDemo.java


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

Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("http://example.com"));
startActivity(intent);
0 голосов
/ 16 января 2018

Я просто хотел скопировать данные URL по длинному клику.
Взяв ссылку на принятый ответ, я написал это.

    registerForContextMenu(webView);


@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);

    WebView webView = (WebView) v;
    HitTestResult result = webView.getHitTestResult();

    if (result != null) {
        if (result.getType() == HitTestResult.SRC_ANCHOR_TYPE) {
            String linkToCopy = result.getExtra();
            copyToClipboard(linkToCopy, AppConstants.URL_TO_COPY);
        }
    }
}
...