Есть ли способ отключить функцию масштабирования в полях ввода в webview?
Когда пользователь нажимает кнопку ввода или текстовое поле, приложение масштабируется.
Есть ли простой способ отключить его?
В настоящее время есть метатег:
meta name="viewport" content="width=device-width; height=device-height; initial-scale=1.0; maximum-scale=1.0; user-scalable=no; target-densityDpi=device-dpi;"
Все выглядит великолепно, пока я не посмотрю на устройство с Android 2.2
В частности HTC Evo 4G.
Ответы
Ответ 1
Я перепутал это много.
У вас должны быть разные решения для разных размеров экрана и телефонов, сделанные с серверов.
Это работает, например, для желания HTC:
<meta content='True' name='HandheldFriendly' />
<meta content='width=640px; initial-scale=0.50; maximum-scale=0.50;minimum-scale=0.50;' name='viewport' />
<meta name="viewport" content="width=640px" />
Это для iphone:
<meta name="viewport" content="width=640px,user-scalable=0" />
Ответ 2
webView.getSettings().setDefaultZoom(WebSettings.ZoomDensity.MEDIUM);
Этот метод устарел на уровне API 19.
это работает в последних версиях Android 4.4.2.
webView.setInitialScale(0);//default,no zoom
webView.getSettings().setSupportZoom(true);
webView.getSettings().setBuiltInZoomControls(true);
webView.getSettings().setLoadWithOverviewMode(false);
webView.getSettings().setUseWideViewPort(false);
webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
Ответ 3
Я нашел ответ, по крайней мере, для меня. Он работает с желанием HTC и низким разрешением Sansung 3.
-
Удалите метатеги из видовых экранов из HTML.
-
В java примените решение, которое можно найти здесь.
this.appView.getSettings().setSupportZoom( true ); //Modify this
this.appView.getSettings().setDefaultZoom(WebSettings.ZoomDensity.FAR);//Add this
Не забудьте проверить, доступен ли WebSettings.ZoomDensity.FAR
для вашей версии SDK (7 и выше).
Ответ 4
Разве это не проблема с настройкой размера текста?
body{
-webkit-text-size-adjust:none;
}
Ответ 5
Просто установите манифест:
android:windowSoftInputMode="adjustPan"
Ответ 6
У меня такая же проблема (на HTC Incredible), и пока не найдено хорошего исправления. Но я заметил, что если вы используете мобильный сайт Google (http://google.com/m), вы не получите этого поведения, я пытаюсь понять, почему это дело.
Я пробовал все исправления, упомянутые в stackoverflow, которые я мог найти, в том числе в этой теме, и ничего, что я нашел, работает до сих пор.
Одно дерьмовое исправление. Я нашел, что работа заключается в том, чтобы установить начальный масштаб на 150 (1.5X), а затем масштабировать ваш сайт соответственно, тогда вы также не получите это поведение масштабирования - может быть, потому, что ему нужен уровень масштабирования 1,5 X, когда вы нажимаете на ввод текста, и если вы уже на этом уровне масштабирования, ничего не происходит? Но, это кажется супер хаки и, вероятно, не является надежным на всех телефонах.
Ответ 7
Вот как я решил это:
На всех моих страницах у меня есть:
<link rel="stylesheet" media="screen and (-webkit-device-pixel-ratio:0.75)" href="css/ldpi.css" />
<link rel="stylesheet" media="screen and (-webkit-device-pixel-ratio:1)" href="css/mdpi.css" />
<link rel="stylesheet" media="screen and (-webkit-device-pixel-ratio:1.5)" href="css/hdpi.css" />
<meta name="viewport" content="target-densitydpi=device-dpi" />
На страницах с полями ввода у меня есть:
<link rel="stylesheet" media="screen" href="css/mdpi.css" />
<meta name="viewport" content="target-densitydpi=medium-dpi" />
Итак, я не пользуюсь hdpi для форм, но, по крайней мере, он не приближается к
Ответ 8
существует поле int webview.class mDefaultScale float
в исходном коде показано, что при отображении экранной клавиатуры изменяется значение mActualScale.
поэтому проблема mDefaultScale. вы можете узнать его на сайте grepcode.
private void displaySoftKeyboard(boolean isTextView) {
InputMethodManager imm = (InputMethodManager)
getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
if (isTextView) {
if (mWebTextView == null) return;
imm.showSoftInput(mWebTextView, 0);
if (mActualScale < mDefaultScale) {
// bring it back to the default scale so that user can enter
// text.
mInZoomOverview = false;
mZoomCenterX = mLastTouchX;
mZoomCenterY = mLastTouchY;
// do not change text wrap scale so that there is no reflow
setNewZoomScale(mDefaultScale, false, false);
adjustTextView(false);
}
}
else { // used by plugins
imm.showSoftInput(this, 0);
}
}
Ответ 9
Я знаю, что эта ветка - это древняя история, но у меня была проблема масштабирования с виртуальной клавиатурой и, в конце концов, нашел решение по этой ссылке:
http://rickluna.com/wp/2012/02/set-app-scaling-in-phonegap-android/
Добавьте эти строки в источник приложения java
appView.getSettings().setSupportZoom(false);
appView.getSettings().setUseWideViewPort(false);
WebSettings ws = appView.getSettings();
ws.setDefaultZoom(WebSettings.ZoomDensity.MEDIUM);
appView.getSettings().setDefaultZoom(WebSettings.ZoomDensity.MEDIUM);
appView.setInitialScale(0);
ws.setSupportZoom(false);
ws.setBuiltInZoomControls(false);
ws.setUseWideViewPort(false);
Я изменил MEDIUM на FAR, который удерживает экран при первоначальном увеличении 1.0.
Надеюсь, это спасет других людей от поиска
Ответ 10
Наконец, я нашел решение для своего реального проекта.
- MainActivity.java
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView mWebView = (WebView) findViewById(R.id.webview);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
mWebView.setOnFocusChangeListener(new MyOnFocusChangeListener(getScale()));
}
Log.i(MainActivity.class.getSimpleName(), "getScale: " + getScale());
}
/**
* Calculate the scale that we need to use manually.
*
* @return the scale that we need
*/
private float getScale() {
DisplayMetrics display = this.getResources().getDisplayMetrics();
int width = display.widthPixels;
Float val = Float.valueOf(width) / Float.valueOf(Constants.PAGE_WIDTH);
return val.floatValue();
}
- MyOnFocusChangeListener.java
public class MyOnFocusChangeListener implements View.OnFocusChangeListener {
protected float mScale;
public MyOnFocusChangeListener(float scale) {
mScale = scale;
}
/**
* Implement this method because we want to apply scale when focus changed.
* @param v the View we want to apply scale when focus changed.
* @param hasFocus has a focus or not.
*/
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
// We must try all cases because mDefaultScale will change on different versions of Android.
try {
Field defaultScale = WebView.class.getDeclaredField("mDefaultScale");
defaultScale.setAccessible(true);
defaultScale.setFloat(v, mScale);
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
try {
Field zoomManager;
zoomManager = WebView.class.getDeclaredField("mZoomManager");
zoomManager.setAccessible(true);
Object zoomValue = zoomManager.get(v);
Field defaultScale = zoomManager.getType().getDeclaredField("mDefaultScale");
defaultScale.setAccessible(true);
defaultScale.setFloat(zoomValue, mScale);
} catch (SecurityException e1) {
e1.printStackTrace();
} catch (IllegalArgumentException e1) {
e.printStackTrace();
} catch (IllegalAccessException e1) {
e.printStackTrace();
} catch (NoSuchFieldException e1) {
try {
Field mProviderField = WebView.class.getDeclaredField("mProvider");
mProviderField.setAccessible(true);
Object webviewclassic = mProviderField.get(v);
Field zoomManager = webviewclassic.getClass().getDeclaredField("mZoomManager");
zoomManager.setAccessible(true);
Object zoomValue = zoomManager.get(webviewclassic);
Field defaultScale = zoomManager.getType().getDeclaredField("mDefaultScale");
defaultScale.setAccessible(true);
defaultScale.setFloat(zoomValue, mScale);
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
}
}
}
Ответ 11
Это дублирующий вопрос. То же самое: отключить масштабирование при нажатии на поля формы в WebView?
Ответ 12
Для меня это тоже было головной болью, но, к счастью, я нашел эту статью: Как перестать увеличивать фокус ввода на мобильных устройствах.
Установите размер шрифта текста в элементе ввода равным 16px (или более) в файле css.
input {
font-size: 16px;
}