2016-03-21 22 views
0

Android web görünümünde özel karakterler ('ä', 'é', '£' vb.) Yazmak istiyorum. Bu karakterler sanal KCM'ye dahil değildir (anahtar karakterler eşlemesi). Bu nedenle, karakterle ilişkili anahtar kodu alamıyorum ve bir KeyEvent oluşturulamıyorum.Android WebView'daki özel karakterleri gir

I güvenilir farklı yöntem: enstrümantasyon yöntemlerle

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 

: ACTION_MULTIPLE KeyEvent ile

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

:

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 

I veri işlemek için bir yöntem onKeyMultiple (WebView) uygulayabilir entry? Web görünümünde özel karakterler girmek için bir çözüm var mı? Kök veya klavye düzeni oluşturulmasını gerektirmeyen bir çözüme ihtiyacım var (kullanıcının klavyeyi seçmemesi gerekiyor).

cevap

0

WebView içindeki bir giriş alanında sanal klavye ile yazarken aynı sorunu yaşadım. "Á" gibi özel karakterleri tanımazdı. Yaptıklarımı:

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

eylem JavaScript ile ACTION_MULTIPLE ben giriş alanı ve ben özel karakter eklemek olduğunu.

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

Umarım yardımcı olur:

İşte bütün sınıftır.

İlgili konular