2013-07-16 6 views
7

Potrzebuję wyłączyć otwartą klawiaturę programową w moim WebView i we wszystkich edittexts w WebView (nie mam dostępu do thay ponieważ jest w WebView).Jak wyłączyć Softkeyboard w WebView

Próbuję użyć "android: windowSoftInputMode =" stateAlwaysHidden "" w moim pliku manifestu, ale wyskakujące okienko klawiatury pojawia się po kliknięciu w pole do edycji.

Jakie jest właściwe rozwiązanie do wyłączania Softkeyboard w WebView?

EDIT:

znajdę rozwiązanie (dzięki @ g00dy w tym poście i @Kachi na stanowiskach https://stackoverflow.com/a/9108219/1665964) ścisłej klawiaturze po nim otwarty:

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); 
     } 
    } 
} 

Kod ten również blisko komunikat systemowy " Edytuj tekst/Metoda wprowadzania ", gdy użytkownik w polu wejściowym.

Ale! Ten kod zamyka klawiaturę dopiero po jej otwarciu. Klawiatura pozostaje widoczna kilka milisekund, a użytkownik (szybki użytkownik) może nacisnąć dowolny klawisz na klawiaturze. To nie jest najlepsza sytuacja.

Może istnieje najlepszy sposób na 100% wyłączenie klawiatury bez jej otwierania?

Odpowiedz

1

dla klawiatury stanie ukrytym:

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); 
     } 

Aby wyłączyć EditTexts:

zestaw android:editable="false" w układzie z nich EditText.setFocusable(false) aktywności.

EDIT:

Aby wykryć zdarzenie click w korzystaniu WebView to:

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

nie mam dostępu do zmiany atrybutów EditText bo mam tylko mój WebView. –

+0

Nie masz więc uprawnień do zmiany atrybutów 'EditText', który znajduje się wewnątrz' WebView', do którego masz dostęp - jak to możliwe? Jaka jest zawartość 'WebView'? Czy wizualizujesz stronę internetową pod Twoją kontrolą lub inną przypadkową stronę internetową? – g00dy

+0

Zamiast tego należy spróbować wykryć kliknięcie, będę edytować mój wpis. – g00dy

5

Ta odpowiedź pracował dla mnie (dostarczone przez Android Weblineindia): https://stackoverflow.com/a/29409478/4813198

Dodaj następujący kod w układzie głównym (macierzystym) w układzie.xml:

> 
> android:descendantFocusability="blocksDescendants" 
> 

i ustawić następujące właściwości w swojej WebView:

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

Rodzaj rozwiązania technikę, która przyszła mi do głowy, ale nadal robi to, co jest wymagane - ukrywa klawiaturę więc użytkownik nie będzie zobacz:

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); 
    } 

} 

Zapraszam do gry z opóźnieniami, aby zminimalizować obciążenie z powodu szybkiego połączenia z zabawą w określonym okresie. Wierzę, że optymalne wartości mogą się różnić w zależności od urządzenia.

-1

Spróbuj takiego rozwiązania, to jest całkiem prosta:

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/");