2016-03-21 21 views
0

Android webviewに特殊文字( 'ä'、 'é'、 '£'など)を入力したいとします。 これらの文字は仮想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に特殊文字を入力するためのソリューションはありますか?私はルートを必要としないか、キーボードレイアウトを作成する必要がある(ユーザはキーボードを選択しない)必要がある。

答えて

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

アクションはJavascriptとACTION_MULTIPLE私は入力フィールドを取得し、私は特別な文字を追加しています。ここで

は、クラス全体である:

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

はそれがお役に立てば幸いです。

関連する問題