2010-09-13 2 views
11

Когда пользователь нажимает кнопку ввода или текстовое поле, приложение масштабируется. Есть ли простой способ отключить его?Есть ли способ отключить функцию масштабирования полей ввода в 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.

+0

Вы хотите полностью отключить масштабирование в 'WebView'? –

+0

Я знаю, что прошло какое-то время, но вам, наконец, удалось решить эту проблему? Отвечает ли TheisEgeberg? – mdelolmo

+0

Это безумие, что это не работает. Честно говоря, если реализация метатега viewport была правильной на основе документации, мы должны просто объявить ширину и сделать это с помощью ish. Но вместо этого он вообще не работает, мы должны прибегнуть к помощи группы, которая помогает устранять проблемы с масштабированием на этих устройствах, а затем разрушает нашу способность предотвращать масштабирование клавиатуры! – SublymeRick

ответ

3

Я испортил это много.

У вас должны быть разные решения для разных размеров экрана и телефонов, сделанные на серверах.

Это работает для 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" /> 
+1

в примере кода htc , почему вы устанавливаете ширину 640px во второй строке, а затем снова устанавливаете ее в одно и то же значение в третьем? –

0

Я получил ту же самую проблему (на HTC Incredible) , и пока не нашли хорошего решения. Но я заметил, что если вы используете мобильный сайт Google (http://google.com/m), вы не получите такого поведения, я пытаюсь понять, почему это так.

Я испробовал все исправления, упомянутые в stackoverflow, которые я мог найти, в том числе по этой теме, и ничего, что я нашел, работает до сих пор.

Одно дерьмовое исправление Я нашел, что работы - установить начальную шкалу на 150 (1.5X), а затем масштабировать ваш сайт соответственно, тогда вы также не получите это изменение масштаба изображения - возможно, потому что он хочет увеличить масштаб 1.5X, когда вы нажимаете на ввод текста, и если вы уже на этом уровне масштабирования, ничего не происходит? Но это чувствует себя супер хаки и, вероятно, не устойчиво ко всем телефонам.

0

Вот как я решил, что:

На всех моих страницах у меня есть:

<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 на формах, но, по крайней мере, он не увеличивается

1

Я нашел ответ, по крайней мере, для меня. Он работает над желанием HTC и низким разрешением Sansung 3.

  • Удалить метатеги из видового экрана из HTML.

  • В java применить решение, которое находится в here.

    this.appView.getSettings().setSupportZoom(true); //Modify this 
    this.appView.getSettings().setDefaultZoom(WebSettings.ZoomDensity.FAR);//Add this 
    

    Не забудьте проверить, если WebSettings.ZoomDensity.FAR доступна для вашего SDK версии (7 и выше).

0

есть поле ИНТ webview.class mDefaultScale всплывают исходный код показывает, что при отображении softkeyboard в 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); 
     } 

    } 
+0

Не могли бы вы подробнее рассказать об этом? Это из исходного кода ОС? есть ли что-нибудь, что мы могли бы сделать здесь, чтобы исправить нашу проблему, или это просто нечто вроде: «Это проблема и почему, но вы не можете что-то сделать с этим»? – SublymeRick

1

Разве это не проблема с настройкой размера текста?

body{ 
    -webkit-text-size-adjust:none; 
} 
+0

Это не работает для меня: S – Rahnzo

0

Я знаю, что эта нить древняя история, но у меня был проблема масштабирования с помощью виртуальной клавиатуры и в конце концов нашел решение по этой ссылке:

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.

Надеется, что спасает другие человек, некоторые в поисках

2
webView.getSettings().setDefaultZoom(WebSettings.ZoomDensity.MEDIUM); 

Этого метод не рекомендуются в уровне API 19.

это работает в последних версиях андроида 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); 
1

Просто установите в манифесте:

android:windowSoftInputMode="adjustPan" 
+0

Это работает, чтобы отключить масштабирование, но веб-просмотр не прокручивается вверх, чтобы показать текстовое поле –

0

Наконец, я нашел решение для моего реального проекта.

- 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(); 
        } 
       } 
      } 
     } 
    } 
} 
+0

, добавьте дополнительную информацию о классах. –

Смежные вопросы