В браузере вы можете долго указывать URL-адреса. В моем WebView вы не можете. Как я могу это сделать, чтобы вы могли?
Включить longClick в WebView
Ответ 1
У меня была такая же проблема.
К сожалению, я не смог найти способ сделать стандартные параметры меню браузера. Вы должны реализовать каждый из них самостоятельно. Я сделал регистрацию 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();
}
Ответ 2
Я бы подумал, что вы можете использовать что-то вроде этого:
WebView yourWebView;
yourWebView.setLongClickable(true);
yourWebView.setOnLongClickListener(...);
Это позволит вам уловить длинные клики в представлении. Что вы делаете после этого... это вам!
Ответ 3
Я бы включил Javascript в webview. Затем используйте onMouseDown() и onMouseUp() для определения продолжительности клика.
Вы можете создавать всплывающие меню в Javascript тоже (не стандартные меню, а ваши собственные).
Наконец, вы можете взаимодействовать между Javascript и кодом Android/Java.
Пример простого взаимодействия между Javascript и Android-приложением.
http://code.google.com/p/apps-for-android/source/browse/trunk/Samples/WebViewDemo/assets/demo.html
В качестве альтернативы вам может понадобиться запустить реальный браузер вместо использования WebView.
Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("http://example.com"));
startActivity(intent);
Ответ 4
Я просто хотел скопировать 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);
}
}
}