2013-05-11 23 views
8

Potrzebuję edytora tekstu/kodu opartego na Internecie, który zachowuje się dobrze, w mojej aplikacji.Nie można uzyskać backspace do pracy w codemirror, pod Phonegap na Androidzie 4.x?

Próbuję użyć codemirror pod Phonegap i obecnie mam problemy z powrotem backspace do pracy dla wcześniej wprowadzonego tekstu. Jest to ogromny problem w moim przypadku użycia. Teraz rozejrzałem się i wygląda na to, że to nie jest bezpośredni problem z codemirror, ale raczej android i malarkey z wirtualną klawiaturą, zobacz to pytanie: Android: Backspace in WebView/BaseInputConnection

Używam wersji Phonegap 2.6.0, najnowszej wersji codemirror (od ostatniej nocy) i testowanie w systemie Android 4.2.2. Wydaje się to być specyficzne dla WebView na Androida, czy ktoś może sprawdzić, czy to nie problem w systemie iOS?

Nie jestem przeciwny temu niektóre kodu Java, aby rozwiązać problem, ale nie jestem pewien, jak „hak” w realizacji Cordova z dnia WebView, jak cały kod, który jest narażony na mnie składa się z:

package com.mycompany.MyAppName; 

import android.os.Bundle; 
import org.apache.cordova.*; 

public class MyAppName extends DroidGap{ 
    @Override 
    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     // Set by <content src="index.html" /> in config.xml 
     super.loadUrl(Config.getStartUrl()); 
     //super.loadUrl("file:///android_asset/www/index.html") 
    } 
} 

chyba że mam zajrzeć do drzewa źródłowego Cordovas. Zasadniczo chcę wiedzieć, w jaki sposób mogę wdrożyć rozwiązanie pod powyższym linkiem w moim przypadku. Każda pomoc jest bardzo cenna!

+0

Tak, to nie jest to problem, który jest specyficzny do CodeMirror, jak również występuje z Asem. Działa również świetnie, gdy używana jest klawiatura sprzętowa. Jest to problem z wirtualną klawiaturą ekranową. – Fred

Odpowiedz

9

Zastąp metoda startowych aktywny:

public class ProjectName extends DroidGap 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 

     init(); // Don't forget this, you'll get runtime error otherwise! 

     // The following does the trick: 
     super.appView.getSettings().setUseWideViewPort(true); 
     super.appView.getSettings().setLoadWithOverviewMode(true); 

     // Set by <content src="index.html" /> in config.xml 
     super.loadUrl(Config.getStartUrl()); 
     //super.loadUrl("file:///android_asset/www/index.html") 
     super.setIntegerProperty("loadUrlTimeoutValue", 10000); 
    } 

    /** 
    * Create and initialize web container with default web view objects. 
    */ 
    @Override 
    public void init() { 
     CordovaWebView webView = new CustomWebView(ProjectName.this); 
     CordovaWebViewClient webViewClient; 
     if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) 
     { 
      webViewClient = new CordovaWebViewClient(this, webView); 
     } 
     else 
     { 
      webViewClient = new IceCreamCordovaWebViewClient(this, webView); 
     } 
     this.init(webView, webViewClient, new CordovaChromeClient(this, webView)); 
    } 

} 

Tworzenie na CustomWebView która rozciąga CordovaWebView

public class CustomWebView extends CordovaWebView{ 

    public CustomWebView(Context context) { 
     super(context); 
    } 

    @Override 
    public InputConnection onCreateInputConnection(EditorInfo outAttrs) { 
     MyCustomInputConnection connection = new MyCustomInputConnection(this, false); 

     return connection; 
    } 

} 

Tworzenie niestandardowej InputConnection:

public class MyCustomInputConnection extends BaseInputConnection{ 

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

    @Override 
    public boolean deleteSurroundingText(int beforeLength, int afterLength) {  
     // magic: in latest Android, deleteSurroundingText(1, 0) will be called for backspace 
     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); 
    } 
} 
+1

To działa! Dziękuję bardzo! Czy mogę zapytać, do czego służą te dwa ustawienia niestandardowe, poniżej komentarza "Następujący robi lew"? Musiałem je wyłączyć, ponieważ strona renderowała wszystkie zminimalizowane, jakby skala była inna. – Nisk

+0

Nie pamiętam, wyłączę je również: p – max28

+0

zrobiłeś mój dzień! Dzięki miliard! – 0m4r