2013-05-11 11 views
8

Ho bisogno di un editor di testo/codice basato sul web che si comporta bene, per la mia app.Non è possibile ottenere backspace per funzionare in codemirror, in PhoneGap su Android 4.x?

Sto provando ad usare codemirror sotto PhoneGap e attualmente sto avendo problemi a recuperare il backspace per il testo inserito in precedenza. Questo è un grosso problema per il mio caso d'uso. Ora ho dato un'occhiata in giro e sembra che non sia un problema di codemirror diretto, ma piuttosto l'androide e la tastiera virtuale malarkey, vedi questa domanda: Android: Backspace in WebView/BaseInputConnection

Sto usando la versione 2.6.0 di Phonegap, ultima versione di codemirror (a partire dalla scorsa notte) e test su Android 4.2.2. Questo sembra essere specifico per WebView su Android, qualcuno potrebbe verificare che non è un problema su iOS?

Io non sono contrario a fare un po 'di codice Java per risolvere il problema, ma non sono sicuro di come 'gancio' nella realizzazione del cordova di WebView, come tutto il codice che è esposto a me si compone di:

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

a meno che non dovessi esaminare l'albero dei sorgenti Cordovas. Essenzialmente quello che voglio sapere è come posso implementare la soluzione al link sopra nel mio caso. Qualsiasi aiuto è molto apprezzato!

+0

Sì, questo non è un problema che è specifico a CodeMirror così come succede anche con Ace. Funziona anche alla grande quando si utilizza una tastiera hardware. È un problema con la tastiera virtuale sullo schermo. – Fred

risposta

9

Override metodo init attività:

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

} 

Crea il CustomWebView che si estende 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; 
    } 

} 

Crea il tuo InputConnection personalizzato:

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

Funziona! grazie mille! Posso chiedere a cosa servono le due impostazioni personalizzate, al di sotto del commento "The following does the trick"? Ho dovuto disabilitarli, poiché la pagina è stata resa "minimizzata" come se la scala fosse diversa. – Nisk

+0

Non ricordo, li disabiliterò anch'io: p – max28

+0

hai fatto la mia giornata! Grazie mille! – 0m4r

Problemi correlati