У нас была та же проблема при работе над приложением Android для клиента, и мне удалось «взломать» это ограничение.
Я взглянул на исходный код Android для класса WebView и заметил updateZoomButtonsEnabled()
-метод , который работал с ZoomButtonsController
-объектом , чтобы включить и отключить управление масштабированием зависит от текущего масштаба браузера.
Я искал метод для возврата ZoomButtonsController
-экземпляра и нашел getZoomButtonsController()
-метод , который возвратил этот самый экземпляр.
Хотя метод объявлен public
, он не задокументирован в WebView
-документации, и Eclipse не может его найти. Итак, я попытался поразмышлять над этим и создал свой собственный WebView
-подкласс, чтобы переопределить onTouchEvent()
-метод, который вызвал элементы управления.
public class NoZoomControllWebView extends WebView {
private ZoomButtonsController zoom_controll = null;
public NoZoomControllWebView(Context context) {
super(context);
disableControls();
}
public NoZoomControllWebView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
disableControls();
}
public NoZoomControllWebView(Context context, AttributeSet attrs) {
super(context, attrs);
disableControls();
}
/**
* Disable the controls
*/
private void disableControls(){
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
// Use the API 11+ calls to disable the controls
this.getSettings().setBuiltInZoomControls(true);
this.getSettings().setDisplayZoomControls(false);
} else {
// Use the reflection magic to make it work on earlier APIs
getControlls();
}
}
/**
* This is where the magic happens :D
*/
private void getControlls() {
try {
Class webview = Class.forName("android.webkit.WebView");
Method method = webview.getMethod("getZoomButtonsController");
zoom_controll = (ZoomButtonsController) method.invoke(this, null);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
super.onTouchEvent(ev);
if (zoom_controll != null){
// Hide the controlls AFTER they where made visible by the default implementation.
zoom_controll.setVisible(false);
}
return true;
}
}
Возможно, вы захотите удалить ненужные конструкторы и, возможно, отреагировать на исключения.
Хотя это выглядит хакерским и ненадежным, оно возвращается к API Level 4 (Android 1.6).
Как указывалось в комментариях @ jayellos , приватный getZoomButtonsController()
-метод больше не существует в Android 4.0.4 и более поздних версиях.
Однако, это не нужно. Используя условное выполнение , мы можем проверить, находимся ли мы на устройстве с API уровня 11+ и использовать предоставляемые функции (см. @ Yuttadhammo answer), чтобы скрыть элементы управления.
Я обновил приведенный выше пример кода, чтобы сделать именно это.