La disattivazione della visualizzazione a pieno schermo di modifica per l'input tastiera virtuale nel paesaggio?
-
30-09-2019 - |
Domanda
dispositivi su Android che utilizzano tastiere molli, voglio evitare che la tastiera a schermo intero editing vista (vedi sotto) di apparire in modalità paesaggio (cioè voglio vedere solo la tastiera software stesso e la mia vista dietro di esso).
Presumo che ciò può essere realizzato utilizzando il metodo setExtractViewShown(false)
su InputMethodService
, ma sono in grado di accedere l'istanza predefinita di questo e non voglio implementare un metodo di input personalizzato.
A cura di aggiungere:. la vista a quale ingresso sta andando non è un TextView
(è un View
con un'implementazione InputConnection
personalizzato), quindi android:imeOptions="flagNoExtractUi"
non funziona qui
Soluzione
I infine ha risposto alla mia domanda:
L'interfaccia utente estratto (cioè la modalità di modifica schermo intero) può essere disattivata in corrispondenza del punto in cui la connessione di ingresso è alto agganciato:
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_EXTRACT_UI;
// etc.
}
Altri suggerimenti
Per fare ciò, individuare l'attività xml e incollare android:imeOptions="flagNoExtractUi"
nel codice. Ma dove dovrebbe essere incollato? Dai un'occhiata al codice di esempio attività di xml e sguardo a EditText:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<EditText
android:imeOptions="flagNoExtractUi"
android:id="@+id/etTextInAct"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10" >
<requestFocus />
</EditText>
</LinearLayout>
Se volete maggiori opzioni di personalizzazione per la tastiera vedere http: / /developer.android.com/guide/topics/ui/controls/text.html
aggiungere il android:imeOptions="flagNoExtractUi"
proprietà per ciascun EditText
nel file XML
.
La risposta di cui sopra mi ha aiutato a capire la soluzione per EditTexts aggiunti in modo dinamico:
editText.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI);
Usa android:imeOptions="flagNoFullscreen"
per conseguire tale funzione.
Inoltre, se si desidera combinare più imeOptions programaticaly, è possibile utilizzare il | sintassi.
Per esempio, al fine di disattivare la vista edit fullscreen nel paesaggio e sostituire il tasto "Avanti" con "OK" (ACTION_DONE) in tastiera, è possibile utilizzare:
editText.setImeOptions(EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI);
Se si sta modificando direttamente l'IME si può impedire che mai la visualizzazione di un ExtractedView sovrascrivendo onUpdateExtractingVisibility
:
@Override
public void onUpdateExtractingVisibility(EditorInfo ei) {
ei.imeOptions |= EditorInfo.IME_FLAG_NO_EXTRACT_UI;
super.onUpdateExtractingVisibility(ei);
}
Lo so che è un po 'tardi, ma per chi è ancora interessato, qui è la mia soluzione: Nel mio caso ho avuto un paesaggio attività che contiene un EditText nella parte superiore di esso e avevo bisogno di implementare completamento automatico funzionalità di questa ricerca attività , che il sovrapposizione tastiera causato un problema che l'utente non può vedere risultato di RecyclerView . Così ho finito per avere questo EditText nel mio layout:
<EditText
android:layout_width="match_parent"
android:layout_height="?actionBarSize"
android:id="@+id/main_search_et"
android:imeOptions="actionSearch|flagNoExtractUi"
android:inputType="text" />
Cheers!
È possibile utilizzare:
android:imeOptions="flagNoFullscreen"
nel vostro EditText
La mia soluzione:
android:imeOptions="flagNoExtractUi|flagNoFullscreen"
È possibile chiamare per nascondere la tastiera morbida e chiara messa a fuoco da SearchView.
public void hideKeyboard(View view) {
InputMethodManager imm = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
super.clearFocus();