2016-03-21 5 views
0

Je souhaite saisir des caractères spéciaux (tels que 'ä', 'é', '£', etc.) dans une vue Web Android. Ces caractères ne sont pas inclus dans le KCM virtuel (carte de caractères clés). Je ne peux donc pas récupérer le code associé au personnage et créer un KeyEvent.Saisie de caractères spéciaux dans Android WebView

J'ai essayé différentes méthodes:

String t = "testàaâäù"; 
char[] charArray = t.toCharArray(); 
if (charArray.length > 0) { 
    KeyCharacterMap keyCharacterMap = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD); 
    KeyEvent[] events = keyCharacterMap.getEvents(charArray); 
} 
// events is null, because some characters aren't include in KCM 
// it never works in any case 

Avec des méthodes d'instrumentation:

instrumentation.sendStringSync("a");     // Display 'a' 
instrumentation.sendStringSync("àâä");     // Display nothing 
instrumentation.sendCharacterSync(KeyEvent.KEYCODE_H); // Display 'h' 
// Instrumentation seems to use KCM for data entry 

Avec ACTION_MULTIPLE KeyEvent:

KeyEvent event = new KeyEvent(SystemClock.uptimeMillis(), String.valueOf("aàâä"), 0, 0); 
focusedView.dispatchKeyEvent(event); 
// Doesn't work with WebView, but works with other components such as EditText. 
// I get this error: Unimplemented WebView method onKeyMultiple called from: android.webkit.WebView.onKeyMultiple 

Puis-je mettre en œuvre la méthode onKeyMultiple (WebView) pour traiter les données entrée? Y a-t-il une solution pour entrer des caractères spéciaux dans le webview? J'ai besoin d'une solution qui ne nécessite pas de root ou la création d'une disposition de clavier (l'utilisateur n'a pas à sélectionner le clavier).

Répondre

0

J'ai eu le même problème lors de l'écriture avec le clavier virtuel sur un champ de saisie dans un WebView. Il ne reconnaîtrait pas les caractères spéciaux comme "á". Ce que je l'ai fait:

if (event.getAction() == KeyEvent.ACTION_MULTIPLE) { 
    loadUrl("javascript:var prevText = document.activeElement.value;" + 
      "var afterText = document.activeElement.value = prevText + \"" + event.getCharacters() + "\";"); 
    return false; 
} 

Lorsque l'action est ACTION_MULTIPLE avec Javascript je reçois le champ de saisie et je joins le caractère spécial.

Voici toute la classe:

public class CustomWebView extends WebView { 

    public CustomWebView (Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    public InputConnection onCreateInputConnection(EditorInfo outAttrs) { 
     ExtenderInputConnection connection = new ExtenderInputConnection(this, false); 
     outAttrs.imeOptions = EditorInfo.IME_ACTION_SEARCH; 
     return connection; 
    } 

    @Override 
    public boolean dispatchKeyEvent(KeyEvent event) { 

     if (event.getAction() == KeyEvent.ACTION_MULTIPLE) { 
      loadUrl("javascript:var prevText = document.activeElement.value;" + 
        "var afterText = document.activeElement.value = prevText + \"" + event.getCharacters() + "\";"); 
      return false; 
     } 

     return super.dispatchKeyEvent(event); 
    } 

    public class ExtenderInputConnection extends BaseInputConnection implements InputConnection { 

     public ExtenderInputConnection(View targetView, boolean fullEditor) { 
      super(targetView, fullEditor); 
     } 


     @Override 
     public boolean deleteSurroundingText(int beforeLength, int afterLength) { 

      if (beforeLength == 1 && afterLength == 0) { 
       // backspace 
       return super.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL)) && super.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DEL)); 
      } 
      return super.deleteSurroundingText(beforeLength, afterLength); 
     } 
    } 
} 

Hope it helps.