如何在 WebView 周围添加填充
Posted
技术标签:
【中文标题】如何在 WebView 周围添加填充【英文标题】:How to add padding around a WebView 【发布时间】:2012-02-28 12:20:22 【问题描述】:我的布局文件定义了一个WebView,下面有一些固定高度的按钮。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_
android:layout_
android:fadingEdge="none">
<WebView
android:id="@+id/webview"
android:layout_
android:layout_
android:layout_weight="1.0"/>
<LinearLayout
android:layout_
android:layout_
android:padding="8dp">
<Button
android:text="Decline"
android:layout_
android:layout_
android:layout_weight="1.0">
</Button>
<Button
android:text="Accept"
android:layout_
android:layout_
android:layout_weight="1.0">
</Button>
</LinearLayout>
</LinearLayout>
我正在尝试在 WebView 周围添加填充,因为目前文本一直延伸到 UI 的边缘。
我尝试将android:padding="8dp"
添加到 WebView,但没有添加填充。我也尝试了 paddingLeft 和 paddingRight,但它们也不起作用。
WebView API 文档确认它继承自 View,后者支持 android:padding 属性,所以我很惊讶这不起作用。
有人知道这是一个已知问题,还是我不理解的布局 XML 的某些交互?
仅供参考,我的解决方法是在 WebView 周围放置一个额外的 LinearLayout,然后添加填充:
<LinearLayout
android:layout_
android:layout_
android:layout_weight="1.0"
android:padding="8dp">
<WebView
android:id="@+id/webview"
android:layout_
android:layout_/>
</LinearLayout>
【问题讨论】:
尝试使用边距而不是填充 - 我认为这就是您想要的。填充对于 WebView imo 来说真的没有意义 好主意,但是我只是尝试在我的原始 XML 中的 WebView 上设置 layout_marginRight 和 layout_marginLeft,结果导致下面的按钮不显示。我想知道为什么我的布局有什么根本错误? 看起来您的 layout_weight 设置不正确。如果按钮是 wrap_content,为什么要给按钮 layout_weight? @DanJ 我告诉你,android 设计师有一些根本性的问题 【参考方案1】:WebView 在填充实现中存在错误。在 webview 上设置填充不会填充实际的网页,但会填充滚动条。它只是部分按预期工作。 您的解决方案是为 WebView 实现“填充”的最佳方式。
【讨论】:
你知道为 WebView 设置 layout_marginRight 和 layout_marginLeft 是否应该有效吗? 6 年仍然是一个错误 7 年仍然是一个错误 7 1/3 年,仍然是一个错误 4 天后 9 年仍然是一个错误【参考方案2】:此问题的另一种解决方法可能是使用 javascript。因此,当您的网页加载时,您可以执行这样的 js 调用来设置填充:
webView.setWebViewClient(new WebViewClient()
@Override
public void onPageFinished(WebView view, String url)
webView.loadUrl("javascript:document.body.style.margin=\"8%\"; void 0");
);
【讨论】:
加一表示“void 0”。没有那个 javascript 就不会运行。 不起作用,没有任何反应。该行被执行。 如果此行在设置填充时不起作用,请确保您的WebView
设置已启用 javascript: ``` webview.settings.javaScriptEnabled = true ```【参考方案3】:
另一种方法是在 ScrollView 中设置 WebView
然后你可以给 WebView 添加左/右边距,它会得到填充效果。然而,滚动将由 ScrollView 处理。
<ScrollView style="@style/MatchMatch">
<WebView
android:id="@+id/my_web_view"
android:layout_marginLeft="@dimen/webViewMargin"
android:layout_marginRight="@dimen/webViewMargin"
android:layout_
android:layout_/>
</ScrollView>
这将导致滚动条被放置在 WebView 之外,这是我希望我的应用程序的行为。
【讨论】:
为什么是滚动视图?一个简单的 FrameLayout 就可以工作,您不必关心可能的嵌套滚动问题。 我选择 ScrollView 是因为我希望滚动条靠在 ScrollView 的边缘。如果我要使用 FrameLayout 滚动条将针对内部 webview。 这是创建相同视觉效果的最佳方式。边距方法会导致看起来错误的滚动行为。然而,如今更好的方法可能是改用NestedScrollView
。
如果顶部和底部也需要“间隙”,那么我会在 NestedScrollView
的顶部和底部填充。这比WebView
上的顶部和底部边距效果更好。但是对于左右两边,边距比填充效果更好。
这应该是公认的答案,因为它按预期工作。我找到了相同的解决方案,它也适用于内容将被缩放而所有 JavaScript 解决方案都没有!【参考方案4】:
尝试添加这个 CSS:
<body style='margin:X;padding:X;'>
【讨论】:
我认为这个答案与问题无关。虽然我知道它可能确实有效,但问题是关于 Android 布局问题,而不是关于WebView
中显示的 html 内容。
感谢您的解决方案。这是向 Web 视图添加内边距的更好方法,因为传统的内边距不适用于内容。【参考方案5】:
@Sergii 的代码对我不起作用,但以下代码对我有用
mWebView.setWebViewClient(new mWebViewClient()
@Override
public void onPageFinished(WebView web, String url)
web.loadUrl("javascript:(function() document.body.style.paddingTop = '55px')();");
);
您也可以将paddingTop
更改为paddingBottom, paddingRight, paddingLeft
。将55px
value 更改为您想要的任何值。此外,为您的 webview
启用 JavaScript
webView.settings.javaScriptEnabled = true
【讨论】:
无法按预期工作,因为在缩放时填充将与内容一起缩放。 paddingLef 和 paddingRight 对我不起作用。使用 padding-left 和 padding-right【参考方案6】:在它周围添加一个带有填充的 LinearLayout。
【讨论】:
【参考方案7】:在这里使用填充不是解决方法。 布局的填充就是为了这个目的。
所以你的“解决方法”是你应该做的。
【讨论】:
你是说 android:padding 值不能在 WebView 上设置? 如果你看TextView.java的源码,它在onDraw()中考虑了padding。但是 WebView.java 没有。这将解释原因。【参考方案8】:我发现的另一个仍然很老套的解决方法是将WebView
包装在FrameLayout
中并在那里添加填充。将父 FrameLayout
的大小设置为 wrap_content
并不好,因为您会收到以下警告:
Placing a <WebView> in a parent element that uses a wrap_content layout_height can lead to subtle bugs; use match_parent instead (wrap_content here may not work well with WebView below)
我的解决方案是将WebView
包装在两个FrameLayout
中。直接父级的宽度和高度大小为match_parent
。这个FrameLayout
包裹在另一个FrameLayout
中,它的宽度和高度设置为wrap_content
。
然后,您只需将直接父级上的填充更改为 WebView
并将其背景颜色设置为与 WebView
匹配即可。
同样,这不是一个很好的解决方案(因为最好的解决方案就是使用 android:padding
属性,如果它有效的话),但这个解决方案仍然比注入 HTML 标记和修改 DOM 以添加内容填充更好到WebView
。
下面是我所说的一个例子:
<FrameLayout
android:layout_
android:layout_>
<FrameLayout
android:paddingBottom="8dp"
android:paddingHorizontal="12dp"
android:background="@color/white"
android:layout_
android:layout_>
<WebView
android:id="@+id/cool_webview_id"
android:layout_
android:layout_ />
</FrameLayout>
</FrameLayout>
【讨论】:
以上是关于如何在 WebView 周围添加填充的主要内容,如果未能解决你的问题,请参考以下文章
Android webview周围有白色边框,我该如何摆脱它?