2016-03-21 2 views
0

Я хочу набрать специальные символы (например, «ä», «é», «£» и т. Д.) В веб-браузере Android. Эти символы не включены в виртуальную KCM (карта ключевых символов). Поэтому я не могу получить код ключа, связанный с символом, и создать KeyEvent.Ввод специальных символов в android WebView

Я попробовал различные методы:

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 

Методами приборов:

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

С 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 

Могу ли я реализовать метод onKeyMultiple (WebView) для обработки данных запись? Есть ли решение для ввода специальных символов в webview? Мне нужно решение, которое не требует root или создания раскладки клавиатуры (пользователю не нужно выбирать клавиатуру).

ответ

0

У меня была такая же проблема при написании виртуальной клавиатуры на поле ввода внутри WebView. Он не распознает специальные символы, такие как «á». То, что я сделал:

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

Когда действие ACTION_MULTIPLE с Javascript я получаю поле ввода, и я добавить специальный символ.

Вот весь класс:

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

Надеется, что это помогает.

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