user pref - 为片段中的webview实现默认缩放比例

时间:2014-12-29 18:50:40

标签: android webview fragment zoom scale

我在一个片段中有一个webview。我还没有找到任何建议的方法来设置初始缩放。大多数人都想缩放,因此内容适合webview。对于我而言,作为一个用户,正是我不想要的。我希望内容缩放比视图大 - 这使我能够以更大的尺寸读取标题,并且如果我需要阅读更长的内容,我可以横向滚动。

因此,对于各种用户和设备,使用固定的缩放比例或尝试猜测用户想要的内容是毫无意义的。

我启用了缩放控件,因此,用户可以为特定页面设置所需的缩放...但是,这只会持续到用户单击链接为止(因为新加载的内容使用webview的缩放比例)设置为最初),或者用户旋转设备(因为destroy / create也会将我们带回webview的初始缩放比例)。

可以轻松设置初始缩放比例。就个人而言,我喜欢220:

mWebView.setInitialScale(220);

但是,所有新内容都设置为此范围,并且,显然无法在运行中再次设置比例。

我还可以使用用户pref设置比例:

mWebView.setInitialScale(defaultPrefs.getInt("xyzBrowserScale", 220));

嘿,我还可以在onTouch回调或onPause中检测并保存用户可能设置的任何内容:

public void onPause() {
    // save current zoom as preference setting
    SharedPreferences.Editor ed = defaultPrefs.edit();
    ed.putInt("xyzBrowserScale", Math.round(mWebView.getScale()*100));
    ed.commit();
    super.onPause();
}

这里有趣且烦人的地方。无论我使用什么回调,新设置只有在下次创建webview时才会生效 - 因为它依赖于setInitialScale()。因此,要使所选缩放对新内容有效,用户可以旋转设备,重新创建片段和webview!

这就是我所谓的用户界面傻瓜:设置缩放,然后旋转以使其变得有用。

所以,问题是,如何更优雅地执行?我不知道任何强制重新创建片段的方法。

或者,我错过了什么?有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

我有一个可以通过的解决方案 - 而不是解决方案 - 没有更好的东西。首先,我没有意识到WebViewClient的onScaleChanged()回调。这是一个很好的地方,可以让用户调整缩放,并将其存储在类变量中:

mWebView.setWebViewClient(new WebViewClient() {
    // stop links from opening in system browser
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }
    public void onScaleChanged(WebView view, float oldScale, float newScale) {
        currentZoom = Math.round(newScale*100);
    }
});

然后,我在溢出菜单中添加了一个项目,以保存缩放。在该菜单上单击,我可以将currentZoom保存到用户首选项,并弹出一个带有注释的对话框以旋转设备:

new AlertDialog.Builder(getActivity())
        .setMessage("Click OK, then rotate device to apply saved zoom")
        .setIcon(android.R.drawable.ic_dialog_alert)
        .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
            }})
        .show();