2014-04-25 23 views
14

Ho una webview con un modulo di inserimento della carta di credito (con i campi standard <input type="text" />). In diverse versioni di Android ottengo diverse tastiere. Kit-Kat sembra non mostrare Prev/Avanti chiavi quando si è all'interno del modulo.È possibile che Android WebView HTML influenzi le funzioni della tastiera o della tastiera?

  1. Sul lato web, ho qualche influenza su questo?
  2. In caso contrario, cosa devo suggerire allo sviluppatore per il lato Android ?

Esempio senza Prev/successivo:

Stesso WebView, con Prev/successivo:

enter image description here

risposta

15

È possibile controllare la tastiera da WebView, ma poiché altre risposte suggeriscono che potrebbe non funzionare con tutte le tastiere mai create. Nonostante ciò, in genere trovo che la maggior parte delle tastiere tradizionali abbia implementato il comportamento che voglio.

La WebView ha un metodo chiamato onCreateInputConnection. È possibile collegare questo metodo e aggiungere (e/o rimuovere) contrassegni allo inputType e/o imeOptions. Ci sono molte bandiere a tua disposizione.

Controllare le opzioni EditorInfo, in particolare IME_FLAG_NAVIGATE_NEXT e IME_FLAG_NAVIGATE_PREVIOUS. Vedi l'utilizzo al di sotto (che rimuove le PREV/NEXT bandiere dalle opzioni di tastiera):

@Override 
public InputConnection onCreateInputConnection(EditorInfo outAttrs) { 
    InputConnection inputConnection = super.onCreateInputConnection(outAttrs); 
    outAttrs.imeOptions = outAttrs.imeOptions & ~EditorInfo.IME_FLAG_NAVIGATE_NEXT & 
       ~EditorInfo.IME_FLAG_NAVIGATE_PREVIOUS; 
    return inputConnection; 
} 

Un'altra cosa che si potrebbe provare è quello di nascondere l'intera barra suggerimenti utilizzando i InputType bandiere TYPE_TEXT_FLAG_NO_SUGGESTIONS. Vedere l'esempio di seguito (che aggiunge il flag "nessun suggerimento" per il tipo di ingresso):

@Override 
public InputConnection onCreateInputConnection(EditorInfo outAttrs) { 
    InputConnection inputConnection = super.onCreateInputConnection(outAttrs); 
    outAttrs.inputType = outAttrs.inputType | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS; 
    return inputConnection; 
} 

Ci sono molte altre flag disponibili per avere un gioco con per personalizzare l'IME direttamente dal WebView. Riferisci lo sviluppatore alle pagine collegate e dovresti essere in grado di ottenere il comportamento che cerchi sulla maggior parte delle tastiere.

3

Hai un controllo minimo, ma non così tanto. Il tipo di controllo (passowrd, numerico, testo) verrà inviato alla tastiera virtuale e utilizzato per modificare il modo in cui le cose vengono visualizzate. Tuttavia, le scelte effettuate dalla tastiera in base a tali opzioni sono specifiche della tastiera: la tastiera Google reagisce in modo diverso rispetto a Swype, che reagisce in modo diverso rispetto a Swiftkey, che reagisce in modo diverso rispetto alla tastiera Samsung, ecc. Non si può davvero contare su un comportamento specifico.

+0

Grazie Gabe.C'è qualcosa che posso dire allo sviluppatore Android di provare dalla loro parte per quanto riguarda questo? – artlung

+0

Sarebbe complicato farlo. A causa di tutte le tastiere, in pratica non sai quale usa un utente. In teoria, se tutte le tastiere di terze parti fossero codificate in modo simile, potresti persino chiedere loro di provare ad analizzare l'html per i tag "" e lasciare che applichino le opzioni IME per la tastiera in un override. Ma un successo non è garantito con questo metodo. – StingRay5

1

Provato su Android Studio 3.0 (SDK API 26), la risposta https://stackoverflow.com/a/23462658/3286489 si interrompe. Dopo la ricerca ho scoperto che funziona.

@Override 
public InputConnection onCreateInputConnection(EditorInfo outAttrs) { 
    InputConnection inputConnection = new BaseInputConnection(this, true); 
    outAttrs.imeOptions = outAttrs.imeOptions & ~EditorInfo.IME_FLAG_NAVIGATE_NEXT & 
      ~EditorInfo.IME_FLAG_NAVIGATE_PREVIOUS; 
    return inputConnection; 
} 

E

@Override 
public InputConnection onCreateInputConnection(EditorInfo outAttrs) { 
    InputConnection inputConnection = new BaseInputConnection(this, true); 
    outAttrs.inputType = outAttrs.inputType | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS; 
    return inputConnection; 
}