Как отключить программную панель в WebView

Мне нужно отключить открытую softkeyboard в моем WebView и во всех редакторах в WebView (я не имею доступа к thay, потому что он находится в WebView).

Я пытаюсь использовать «android: windowSoftInputMode =« stateAlwaysHidden »в моем файле манифеста, но клавиатура появляется, когда я нажимаю в редактируемом поле.

Какое правильное решение для отключения softkeyboard в WebView?

РЕДАКТИРОВАТЬ:

Я нахожу решение (спасибо @ g00dy в этом сообщении и @Kachi в post https://stackoverflow.com/a/9108219/1665964 ) для закрытой клавиатуры после его открытия:

public class ActivityBrowser extends Activity { private static WebView webviewHTML; private static View viewRootHTML; private static int iViewRootHTMLHeightDifferent; public static Context contextBrowser; { contextBrowser = this; } public class webViewClient extends WebViewClient { @Override public void onPageStarted( WebView view, String url, Bitmap favicon) { if( view == webviewHTML) super.onPageStarted( view, url, favicon); } @Override public void onPageFinished( WebView view, String url) { if( view == webviewHTML) super.onPageFinished( view, url); } @Override public boolean shouldOverrideUrlLoading( WebView view, String url) { if( view == webviewHTML) view.loadUrl( url); return false; // return super.shouldOverrideUrlLoading( view, url); } @Override public void onReceivedError( WebView view, int errorCode, String description, String failingUrl) { if( view == webviewHTML) ApplicationLeta.fPopup( getString( R.string.sPopupErrorSiteOpen) + " : " + description); // ActivityBrowser.this.finish(); } public void onReceivedSslError( WebView view, SslErrorHandler handler, SslError error) { if( view == webviewHTML) handler.proceed(); } } @Override public boolean dispatchTouchEvent( MotionEvent motionEvent) { super.dispatchTouchEvent( motionEvent); if( motionEvent.getAction() == MotionEvent.ACTION_MOVE) return true; if( motionEvent.getAction() == MotionEvent.ACTION_UP) { // do something } if( motionEvent.getAction() == MotionEvent.ACTION_UP) { // do something } return false; } @Override public void onBackPressed() { } @Override public void onWindowFocusChanged( boolean eFocus) { super.onWindowFocusChanged( eFocus); if( eFocus == false) { fKeyboardClose(); new Thread( new Runnable() { @Override public void run() { try { Instrumentation inst = new Instrumentation(); inst.sendKeyDownUpSync( KeyEvent.KEYCODE_BACK); } catch( Exception e) {} } } ).start(); } } private void fKeyboardClose() { InputMethodManager inputMethodManager = (InputMethodManager)getSystemService( Activity.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow( getCurrentFocus().getWindowToken(), 0); } public OnGlobalLayoutListener onGlobalLayoutListener = new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Rect rect = new Rect(); viewRootHTML.getWindowVisibleDisplayFrame( rect); iViewRootHTMLHeightDifferent = viewRootHTML.getRootView().getHeight() - (rect.bottom - rect.top); if( iViewRootHTMLHeightDifferent > 50) fKeyboardClose(); } }; @SuppressWarnings( "deprecation") @SuppressLint( "SetJavaScriptEnabled") public void onCreate( Bundle savedInstanceState) { super.onCreate( savedInstanceState); setContentView( R.layout.browser); if( savedInstanceState == null) { viewRootHTML = findViewById( R.id.linearLayoutHTML); viewRootHTML.getViewTreeObserver().addOnGlobalLayoutListener( onGlobalLayoutListener); webviewHTML = (WebView) findViewById( R.id.webviewHTML); WebSettings webSettings = webviewHTML.getSettings(); webSettings.setJavaScriptEnabled( true); webSettings.setJavaScriptCanOpenWindowsAutomatically( true); webviewHTML.setWebViewClient( new wiewClient()); webviewHTML.loadUrl( ApplicationLeta.sAppInterviewURL); } } } 

Этот код также закрывает системное сообщение «Редактировать текст / метод ввода», когда пользователь нажимает на поле ввода.

Но! Этот код закрывает клавиатуру только после ее открытия. Клавиатура остается видимой на несколько миллисекунд, и пользователь (быстрый пользователь) может нажать любую клавишу на клавиатуре. Это не лучшая ситуация.

Может быть, существует лучший способ отключить клавиатуру на 100% без ее открытия?

Этот ответ работал для меня (предоставляется Android Weblineindia): https://stackoverflow.com/a/29409478/4813198

Добавьте следующий код в основной (родительский) макет в layout.xml:

 > > android:descendantFocusability="blocksDescendants" > 

И задайте следующие свойства в вашем веб-просмотре:

 > android:focusable="false" > android:focusableInTouchMode="true" 

Для скрытого состояния клавиатуры:

 public void hideSoftKeyboard(View v) { Activity activity = (Activity) v.getContext(); InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0); } 

Чтобы отключить EditTexts :

Установите android:editable="false" в макете их EditText.setFocusable(false) в действии.

РЕДАКТИРОВАТЬ:

Чтобы обнаружить событие click в WebView используйте следующее:

  mWebView.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { // The code of the hiding goest here, just call hideSoftKeyboard(View v); return false; } }); 

Это своего рода хакерское решение, которое пришло мне в голову, но все же делает то, что требуется – скрывает клавиатуру, поэтому пользователь ее не увидит:

 public class WebViewEx extends WebView { private Handler mHandler; @Override public boolean onTouchEvent(MotionEvent event) { ensureKeyboard(); return super.onTouchEvent(event); } private void ensureKeyboard() { if(mHandler == null){ mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); closeKeyboard(); sendEmptyMessageDelayed(0, 10); } }; } mHandler.removeCallbacksAndMessages(null); mHandler.sendEmptyMessage(0); mHandler.postDelayed(new Runnable() { @Override public void run() { mHandler.removeCallbacksAndMessages(null); } }, 300); } private void closeKeyboard() { InputMethodManager inputMethodManager = (InputMethodManager) getContext().getSystemService(Activity.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow(getWindowToken(), 0); } } 

Не стесняйтесь играть с задержками, чтобы минимизировать накладные расходы из-за быстрого вызова функции в течение предопределенного периода. Я считаю, что оптимальные значения могут отличаться в зависимости от устройства.

Попробуйте такое решение, это довольно просто:

 final WebView webView = (WebView) findViewById(R.id.webView); webView.getSettings().setJavaScriptEnabled(true); final String js = "javascript: var allInputs = document.getElementsByTagName('input'); for (var i = 0, len = allInputs.length; i < len; ++i) { allInputs[i].readOnly = true;}"; webView.setWebViewClient(new WebViewClient(){ @Override public void onPageFinished(WebView view, String url) { if (Build.VERSION.SDK_INT >= 19) { view.evaluateJavascript(js, new ValueCallback<String>() { @Override public void onReceiveValue(String s) { } }); } else { view.loadUrl(js); } } }); webView.loadUrl("https://www.google.de/");