所以我们有一个案例,我们会有一些JSON,其中key是id(int),值是字符串.但是我们注意到大多数时候,我们根据字符串查找id,所以我们决定将其反转并将字符串作为键,值为id.因为这样而不是遍历每个项目并比较值,我们可以这样做var id = storage[text];.以下是我们所做的例子.
这是旧实现的示例:
var storage = {
0 : null,
1 : "Hello",
2 : "world!",
3 : "How are you?"
}
Run Code Online (Sandbox Code Playgroud)
以下是新实现的示例:
var storage = {
"null" : 0,
"Hello" : 1,
"world!" : 2,
"How are you?" : 3
}
Run Code Online (Sandbox Code Playgroud)
我知道现在字符串是键,并且可以为相同的字符串获取相同的id.但是从现在开始字符串可能非常巨大(机会很小,但每个字符串可能最大1KB),JS或Android webview是否存在长度限制对象键?
而且,这种实施有缺点吗?到目前为止我没有发现任何问题,但你永远都不知道.
我试图让WebView具有与Android浏览器类似的行为.浏览器以试图使其宽度适合屏幕的方式打开所有页面.但是,WebView的默认行为是以100%像素比例开始,因此它会在左上角开始放大.
我花了最近几个小时试图找到一种方法让WebView将页面缩放到屏幕,就像在浏览器中一样,但我没有运气.有人找到了实现这个目标的方法吗?
我看到的是一个名为setLoadWithOverviewMode的设置,但它似乎根本没有做任何事情.我还尝试了setInitialScale,但是在不同的屏幕尺寸和网页尺寸上,它们不像浏览器缩放那样优雅.
任何人有任何线索?
谢谢
编辑:布莱恩的方法似乎适用于手机在风景但不是肖像.在肖像中,它很接近,但仍然不适合页面中的整个屏幕.我开始这个赏金,希望有一个确定的方法来获得初始缩放以使页面适合任何方向或屏幕大小的页面宽度.
我有一个使用xml布局的活动,其中嵌入了WebView.我不是在我的活动代码中使用的WebView可言,它是所有在我的XML布局坐在那里,是可见的.
现在,当我完成活动时,我发现我的活动没有从内存中清除.(我通过hprof转储检查).如果我从xml布局中删除WebView,则活动完全清除.
我已经试过了
webView.destroy();
webView = null;
Run Code Online (Sandbox Code Playgroud)
在我的活动的onDestroy()中,但这没有多大帮助.
在我的HPROF转储,我的活动(名为"浏览器")有如下剩余GC根(已调用之后destroy()就可以了):
com.myapp.android.activity.browser.Browser
- mContext of android.webkit.JWebCoreJavaBridge
- sJavaBridge of android.webkit.BrowserFrame [Class]
- mContext of android.webkit.PluginManager
- mInstance of android.webkit.PluginManager [Class]
Run Code Online (Sandbox Code Playgroud)
我发现,另一个开发经历了类似的事情,看到菲利佩阿布兰特什的回答上: http://www.curious-creature.org/2008/12/18/avoid-memory-leaks-on-android/
确实是一个非常有趣的帖子 最近我在Android应用程序上对内存泄漏进行故障排除非常困难.最终事实证明,我的XML布局包括,即使不使用的WebView组件,是防止内存被G-收集屏幕转/应用程序重新启动后,...这是当前实现的一个bug,或者是有什么特定于使用WebView时需要执行的操作
现在,遗憾的是,博客或邮件列表中尚未对此问题做出回复.因此,我想知道,是在SDK中的错误(也许类似的MapView错误报道http://code.google.com/p/android/issues/detail?id=2181)或如何完全得到活动嵌入了webview的内存?
我开始在Android上开发应用程序了,所以我没有太多东西.到目前为止,我只是一个WebView.我在Android Studio中创建了项目,我的项目被设置为Android InstantApp.我不知道为什么/如何,但我的猜测是我在创建项目时忽略了它的选项.
我从WebView收到一个错误,说net :: ERR_CLEARTEXT_NOT_PERMITTED.当我搜索错误时,我看到当应用程序是InstantApp时,WebViews只能加载HTTPS的站点,并且无法加载HTTP站点.
这个应用程序的目的是成为一个非常简单的Flash播放器,只适用于一个站点.这是为了在运行需要Flash的游戏时获得更好的性能.这个游戏是在darkorbit.com,这是HTTPS.
MainActivity.java:
package com.tylerr147.darkorbit;
import android.content.ComponentName;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebSettings;
import android.webkit.WebView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView wv = findViewById(R.id.webView1);
wv.loadUrl("https://darkorbit.com/");
wv.setWebViewClient(new CustomWebViewClient());
WebSettings webSettings = wv.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setPluginState(WebSettings.PluginState.ON);
}
}
Run Code Online (Sandbox Code Playgroud)
和CustomWebViewClient.java
package com.tylerr147.darkorbit;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class CustomWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题:如何禁用我的应用程序作为InstantApp,或者如何让这个WebView显示该网站? …
我想在我的Android应用程序中对某些Java代码进行同步调用.
我正在使用此解决方案:https: //stackoverflow.com/a/3338656
我的Java代码:
final class MyWebChromeClient extends WebChromeClient {
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
Log.d("LogTag", message);
result.confirm();
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
我的JavaScript代码:
<html>
<script>
function java_request(){
alert('test');
}
</script>
<body>
<h2>Welcome</h2>
<div id="area"></div>
<form>
<input type="button" value="java_call" onclick="java_request()">
</form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
当我点击java_call按钮时,按钮进入按下状态.我可以'test'在控制台日志中看到.一切都很正常,直到这里.
问题是,按钮永远不会恢复到正常状态.它保持在按下状态.也许JavaScript执行被破坏了什么?
为什么按钮永远不会恢复正常状态?
我有一个带有按钮的简单页面,按下该按钮时,使用异步剪贴板 API 写入剪贴板。
<body>
<button type="button" onclick="testClipboard();">
Test Clipboard
</button>
</body>
Run Code Online (Sandbox Code Playgroud)
function testClipboard() {
navigator.clipboard.writeText("Clipboard API Test").then(
v => alert("Success"),
e => alert("Fail\n" + e));
}
Run Code Online (Sandbox Code Playgroud)
这适用于 Chrome 和 Firefox、桌面和移动设备。但是在 Android Webview 上,它会引发以下错误:
NotAllowError: Write permission denied.
我想我需要覆盖WebChromeClient.onPermissionRequest()以授予权限,但奇怪的onPermissionRequest()是似乎没有被调用,并且仍然抛出相同的错误。
public class WebChromeController extends WebChromeClient {
@Override
public void onPermissionRequest(PermissionRequest request) {
Log.d("myTag", "Permission request");
Log.d("myTag", request.getResources().toString());
request.grant(request.getResources());
}
}
protected void initWebView() {
// ...
myWebView.setWebChromeClient(new WebChromeController());
}
Run Code Online (Sandbox Code Playgroud)
我仍然收到相同的错误:
NotAllowError: Write permission denied.
Logcat 也没有记录任何内容。
我怀疑我的 Android …
我想知道用户何时点击webview而不是超链接.在该单击时,我想显示/隐藏包含webview的活动视图.有什么建议吗?
WebSettings中有一些与缩放相关的方法:
我发现他们在某些设备上的工作方式不同 例如,在我的Galaxy S上,默认情况下启用缩放功能,但在LG P500上它被禁用(现在我不知道如何启用仅捏缩放,但隐藏缩放按钮).
在P500上,当我打电话时,setBuiltInZoomControls(true)我得到这两个变体工作(多点触控和按钮).
如何在LG P500等设备上启用多点触控缩放和禁用缩放按钮?(另外,我知道HTC设备上存在同样的问题)
更新:这里几乎是解决方案的完整代码
if (ev.getAction() == MotionEvent.ACTION_DOWN ||
ev.getAction() == MotionEvent.ACTION_POINTER_DOWN ||
ev.getAction() == MotionEvent.ACTION_POINTER_1_DOWN ||
ev.getAction() == MotionEvent.ACTION_POINTER_2_DOWN ||
ev.getAction() == MotionEvent.ACTION_POINTER_3_DOWN) {
if (multiTouchZoom && !buttonsZoom) {
if (getPointerCount(ev) > 1) {
getSettings().setBuiltInZoomControls(true);
getSettings().setSupportZoom(true);
} else {
getSettings().setBuiltInZoomControls(false);
getSettings().setSupportZoom(false);
}
}
}
if (!multiTouchZoom && buttonsZoom) {
if (getPointerCount(ev) > 1) {
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
此代码位于我onTouchEvent重写的WebView方法中.
我想让我的android webview应用程序打开tel:电话链接.每次打开电话链接时,它都能很好地打开电话.然而,一旦我完成了我的通话并返回应用程序,它就会出现在"未找到网页电话:0000000000"的页面上.然后我必须再次点击后退按钮才能进入我点击电话号码的页面.
有没有办法让它打开TEL链接而不试图在webview中找到页面以及在手机上打开它?
这是我在WebView中使用的代码,用于覆盖其对TEL和Mailto链接的处理:
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("mailto:") || url.startsWith("tel:")) {
Intent intent = new Intent(Intent.ACTION_VIEW,
Uri.parse(url));
startActivity(intent);
}
view.loadUrl(url);
return true;
}
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激.我花了最后2个小时来搜索goodle并且未能提出任何答案.
在我看来WebView,我有一些具有背景颜色(不同于白色)的块元素.然而,背景颜色并没有一路走过天空 ..嗯,屏幕.相反,它会在右侧留下一个小的白色条带,用于滚动条的位置.现在,我希望滚动条仅在滚动时出现(并在用户完成滚动后逐渐消失).我试过了:
android:fadingEdge="vertical|horizontal"
android:fadeScrollbars="true"
android:scrollbarStyle="insideOverlay" (and all other options)
Run Code Online (Sandbox Code Playgroud)
另外,我的HTML包含以下内容<head>:
<meta name="viewport" content="target-densitydpi=device-dpi" />
Run Code Online (Sandbox Code Playgroud)
因此它不允许缩放,默认情况下不会缩小.
但是,我无法弄清楚如何摆脱白色条带.有任何想法吗?
android ×10
android-webview ×10
javascript ×3
clipboard ×1
multi-touch ×1
scale ×1
webview ×1
width ×1
zoom ×1