2013-08-07 19 views
10

Sto costruendo un editor di testo ricco di Android. Per fare ciò, sto usando un webView con un contentEditable div.Impossibile eliminare immagine in div contenteditable su Android

Per aggiungere stili, invoco JavaScript. Funziona tutto bene, tranne quando invoco JavaScript per inserire un'immagine o una regola orizzontale. Quando uso JavaScript per inserire queste cose, se poi provo a premere il pulsante Indietro per cancellare l'immagine o la regola orizzontale, non funziona.

Stranamente, se prima entrare in qualsiasi altro personaggio, e quindi inserire l'immagine o riga orizzontale, posso eliminare l'immagine/riga orizzontale più che bene, ma non riesco a cancellare il carattere sono entrato subito prima che l'immagine regola/orizzontale.

Ho provato stampare il codice HTML in ogni stato, controllo della selezione/gamma, ecc, e non riesco a trovare tutto ciò che è diverso lo stato che potrebbe spiegare il motivo per cui non riesco a cancellare l'immagine, ecc

+0

Potresti provare a fornire alcuni input su come si codificato sia il codice HTML + Javascript e il codice Java di Android (sto cercando di indovinare il WebChromeClient)? – Tomap

+0

Non fornisci informazioni sufficienti per essere molto precisi, azzarderei un'ipotesi che dato che hai HTML dietro le quinte il tuo backspace cancella effettivamente l'ultima parte del tag (che è enoguh per impedirne la visualizzazione) e il motivo per cui non è possibile cancellare ciò che è visivamente prima che l'elemento sia che ulteriori pressioni di backspace cancellano più tag. E ..


viene visualizzato, thenbackspace e si ha

+0

Mostrare qualche codice JS, mostrare alcuni esempi di contenuto div (http://stackoverflow.com/questions/how-to-ask) È necessario implementare e aggiungere un listener di eventi al div che sa come eliminare un elemento HTML completo, ad es quando premi Backspace o Elimina. – stackunderflow

risposta

0

Ho implementato un richTextEditor utilizzando WebView e JavaScript.

Non ho avuto problemi nell'inserire/eliminare l'immagine che ho aggiunto alla pagina HTML modificabile del contenuto . Il codice che ho usato per inserire l'immagine è

Grazie.

+0

Non ci sono problemi nell'eliminare l'immagine con il cursore? Ho tutti i tipi di problemi a farlo. Ho provato a sovrascrivere il metodo deleteSurroundingText, che molti altri thread su Stackoverflow suggeriscono, ma in realtà non ha avuto fortuna. Ignorando ciò, ha rovinato tutto lo stato di completamento automatico, quindi inserire o eliminare i caratteri casuali frequentemente, ovviamente un grosso problema. – user2658889

+0

Sono stato in grado di inserire un'immagine eseguendo sopra javascript e anche in grado di eliminarlo premendo il tasto backpress in SoftKeyboard. Lavorando su nexus, htc one v ma in dispositivi di fascia bassa ha alcuni problemi bloccati. – DroidBot

1

Android: Backspace in WebView/BaseInputConnection

sottoclasse Webview e l'override del metodo, come mostrato dalla domanda di questo ragazzo.

Su alcuni telefoni, solo la domanda del ragazzo soddisferà i requisiti. La risposta del collegamento completerà il codice per compatibilità con altri telefoni. Tuttavia, si sottoclassi un InputConnectionWrapper. non inputconnection. e quindi restituire quel wrapper all'interno della tua webview personalizzata.

Solo una FYI, questo collegamento ha una spiegazione molto più dettagliata della situazione, tuttavia ho provato a implementare rapidamente le loro idee e non ha funzionato. Forse troppo complicato per i miei scopi. Il motivo per cui ho provato la loro soluzione invece di ciò che ho menzionato sopra è perché la soluzione che ho menzionato sopra fa sì che la funzione voice-to-text non funzioni correttamente. Android - cannot capture backspace/delete press in soft. keyboard

-1
<div contenteditable="true"></div> 

Io lo uso per fare un editor in una WebView

Poi l'override metodo TapInputConnection in Webview

@Override 
public InputConnection onCreateInputConnection(EditorInfo outAttrs) { 
    return new TapInputConnection(super.onCreateInputConnection(outAttrs)); 
} 



class TapInputConnection implements InputConnection { 

    private InputConnection mConnection; 


    public TapInputConnection(InputConnection conn){ 
     this.mConnection = conn; 
    } 

    @Override 
    public CharSequence getTextBeforeCursor(int n, int flags) { 
     return mConnection.getTextBeforeCursor(n, flags); 
    } 

    @Override 
    public CharSequence getTextAfterCursor(int n, int flags) { 
     return mConnection.getTextAfterCursor(n, flags); 
    } 

    @Override 
    public CharSequence getSelectedText(int flags) { 
     return mConnection.getSelectedText(flags); 
    } 

    @Override 
    public int getCursorCapsMode(int reqModes) { 
     return mConnection.getCursorCapsMode(reqModes); 
    } 

    @Override 
    public ExtractedText getExtractedText(ExtractedTextRequest request, int flags) { 
     return mConnection.getExtractedText(request, flags); 
    } 

    @Override 
    public boolean deleteSurroundingText(int beforeLength, int afterLength) { 
     return mConnection.deleteSurroundingText(beforeLength, afterLength); 
    } 

    @Override 
    public boolean setComposingText(CharSequence text, int newCursorPosition) { 
     return mConnection.setComposingText(text, newCursorPosition); 
    } 

    @Override 
    public boolean setComposingRegion(int start, int end) { 
     return mConnection.setComposingRegion(start, end); 
    } 

    @Override 
    public boolean finishComposingText() { 
     return mConnection.finishComposingText(); 
    } 

    @Override 
    public boolean commitText(CharSequence text, int newCursorPosition) { 
     return mConnection.commitText(text, newCursorPosition); 
    } 

    @Override 
    public boolean commitCompletion(CompletionInfo text) { 
     return mConnection.commitCompletion(text); 
    } 

    @Override 
    public boolean commitCorrection(CorrectionInfo correctionInfo) { 
     return mConnection.commitCorrection(correctionInfo); 
    } 

    @Override 
    public boolean setSelection(int start, int end) { 
     return mConnection.setSelection(start, end); 
    } 

    @Override 
    public boolean performEditorAction(int editorAction) { 
     return mConnection.performEditorAction(editorAction); 
    } 

    @Override 
    public boolean performContextMenuAction(int id) { 
     return mConnection.performContextMenuAction(id); 
    } 

    @Override 
    public boolean beginBatchEdit() { 
     return mConnection.beginBatchEdit(); 
    } 

    @Override 
    public boolean endBatchEdit() { 
     return mConnection.endBatchEdit(); 
    } 

    @Override 
    public boolean sendKeyEvent(KeyEvent event) { 
     if (event.getKeyCode() == KeyEvent.KEYCODE_DEL) { 
      if (event.getAction() == KeyEvent.ACTION_UP) { 
       delete(); 
      } 
      return true; 
     } 
     return mConnection.sendKeyEvent(event); 
    } 

    @Override 
    public boolean clearMetaKeyStates(int states) { 
     return false; 
    } 

    @Override 
    public boolean reportFullscreenMode(boolean enabled) { 
     return mConnection.reportFullscreenMode(enabled); 
    } 

    @Override 
    public boolean performPrivateCommand(String action, Bundle data) { 
     return mConnection.performPrivateCommand(action, data); 
    } 

    @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
    @Override 
    public boolean requestCursorUpdates(int cursorUpdateMode) { 
     return mConnection.requestCursorUpdates(cursorUpdateMode); 
    } 
} 

Hai capito che sovrascrivo sendKeyEvent e mi occupo di Delete chiave da solo

Questo è ilFunzione;

public void delete(){ 
    loadurl("javascript:document.execCommand('delete', false, null);"); 
} 
+0

Per favore, per favore, per favore cambia la tua formattazione. Grazie. –

Problemi correlati