Wyłączyć widok edycji pełnoekranowej dla wprowadzania z klawiatury w trybie poziomym?

237

Na urządzeniach z Androidem, które używają miękkich klawiatur, chcę zapobiec wyświetlaniu widoku edycji klawiatury pełnoekranowej (pokazanego poniżej) w trybie poziomym (tzn. Chcę widzieć tylko samą klawiaturę miękką i mój widok za nią).

Zakładam, że można to osiągnąć przy użyciu tej setExtractViewShown(false)metody InputMethodService, ale nie mogę uzyskać dostępu do domyślnej instancji tego i nie chcę implementować niestandardowej metody wprowadzania.

Widok edycji pełnoekranowej dla systemu Android

Edytowano, aby dodać: widok, do którego zmierza wejście, nie jest TextView(jest Viewz niestandardową InputConnectionimplementacją), więc android:imeOptions="flagNoExtractUi"tutaj nie będzie działać.

jnic
źródło
Spróbujmy to zobaczyć. To dobrze dla ciebie. [Spójrz na ten] [1] [1]: stackoverflow.com/questions/8648401/...
sonida
mam podobny problem :( możesz mieć jakiś pomysł? stackoverflow.com/questions/36914290/...
wędrowca
2
jak zastosować to w całej aplikacji. Nie dodamy wartości atrybutu do każdego tekstu edycyjnego w xml.
Vikas Pandey,
2
Wiele poniższych odpowiedzi zaleca użycie flagNoExtractUilub IME_FLAG_NO_EXTRACT_UI. Jednak w dokumentacji IME_FLAG_NO_EXTRACT_UI, która odpowiada flagNoExtractUi, stwierdza, że ​​„Odradza się korzystanie z tej flagi i może ona stać się przestarzała w przyszłości”, podobnie flagNoFullscreenjak zalecana opcja.
ThomasW

Odpowiedzi:

178

W końcu odpowiedziałem na moje pytanie:

Interfejs wyodrębniania (tj. Tryb edycji pełnoekranowej) można wyłączyć w punkcie, w którym podłączane jest połączenie wejściowe:

@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {

    outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_EXTRACT_UI;

    // etc.
}
jnic
źródło
215
po prostu umieść w swoim pliku xml android: imeOptions = "flagNoExtractUi"
1
jnic, gdzie to zrobiłeś w kodzie softkey? SoftKeyboard.java? Próbowałem tego samego zastąpienia i błąd zniknął.
14
Prawdopodobnie będziesz chciał dodać flagę do opcji zamiast nadpisywania tego, co kiedykolwiek było przekazywane w ten sposób:outAttrs.imeOptions |= EditorInfo.IME_FLAG_NO_EXTRACT_UI;
ObsidianX
2
@ user726518 jak zastosować ten atrybut do elementu pola wyszukiwania na pasku akcji?
Menna-Allah Sami
1
Jedyne, co działało, gdy korzystałeś z niestandardowego widoku do obsługi klawiatury. Dzięki!
Herman
109

Aby to zrobić, przejdź do działania xml i wklej android:imeOptions="flagNoExtractUi"swój kod. Ale gdzie należy go wkleić? Spójrz na kod przykładowego działania xml i spójrz na 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>

Jeśli chcesz uzyskać więcej opcji dostosowywania klawiatury, zobacz http://developer.android.com/guide/topics/ui/controls/text.html

pbarański
źródło
64

dodaj właściwość android:imeOptions="flagNoExtractUi"do każdego EditTextw swoim XMLpliku.

Michał Yaworski
źródło
1
Ta odpowiedź jest zbyt krótka i nie spełnia standardów jakości SO. Popraw go, dodając kilka dodatkowych wyjaśnień, aby był on użyteczny dla społeczności, a nie tylko dla PO.
Lorenzo Donati - Codidact.org
31
@LorenzoDonati to dokładnie to, co musisz zrobić ... to bardzo prosta odpowiedź, ponieważ rozwiązanie jest bardzo proste i to po prostu inny sposób na zrobienie tego niż powyższe odpowiedzi. Ponadto odpowiedzi nie mogą być „zbyt krótkie”, chyba że nie odpowiedzą na pytanie, IMO.
Michael Yaworski
1
Przepraszamy, ale nie tak o tym myśli społeczność SO. Odpowiedzi nie powinny ograniczać się do rozwiązania problemu PO, powinny być ogólnie świetnymi odpowiedziami. Zobacz to i to na przykład.
Lorenzo Donati - Codidact.org
22
@LorenzoDonati jest to bardzo konkretne pytanie z tylko jednym rezultatem końcowym (ale wieloma sposobami na jego rozwiązanie). Moja odpowiedź jest dodatkiem do innych odpowiedzi na tej stronie. WSZYSTKIE odpowiedzi na tej stronie są ograniczone tylko do „problemu OP”, ponieważ jest to jedyny rodzaj odpowiedzi, który można napisać. Jak powiedziałem, jest specyficzny i prosty.
Michael Yaworski
2
w końcu znalazłem odpowiedź. Dziękuję bardzo @mike yaworski
DRX
53

Powyższa odpowiedź pomogła mi znaleźć rozwiązanie dla dynamicznie dodawanych tekstów EditTexts:

editText.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI);
Abdo
źródło
37

Użyj, android:imeOptions="flagNoFullscreen"aby osiągnąć tę funkcję.

Ridoy
źródło
1
ładne i lepsze podejście do pisania w XML. Pracuje dla mnie. Dzięki
Ahesanali Suthar,
1
Należy zauważyć, że w dokumentacji IME_FLAG_NO_EXTRACT_UI, która odpowiada flagNoExtractUi, stwierdza, że ​​„Nie flagNoFullscreenzaleca się używania tej flagi i może ona stać się przestarzała w przyszłości”, podobnie jak zalecana opcja.
ThomasW
12

Ponadto, jeśli chcesz programowo łączyć wiele imeOptions, możesz użyć | składnia.

Na przykład, aby wyłączyć widok edycji pełnoekranowej w orientacji poziomej i zastąpić klawisz „Dalej” klawiszem „OK” (ACTION_DONE) na klawiaturze, możesz użyć:

editText.setImeOptions(EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI);
Maxime Ancelin
źródło
9

Jeśli bezpośrednio modyfikujesz edytor IME, możesz uniemożliwić mu wyświetlanie ExtractedView, zastępując onUpdateExtractingVisibility:

@Override
public void onUpdateExtractingVisibility(EditorInfo ei) {
    ei.imeOptions |= EditorInfo.IME_FLAG_NO_EXTRACT_UI;
    super.onUpdateExtractingVisibility(ei);
}
ObsidianX
źródło
6

Wiem, że jest trochę za późno, ale dla każdego, kto jest nadal zainteresowany, oto moje rozwiązanie: w moim przypadku miałem aktywność poziomą zawierającą tekst EditText i musiałem zaimplementować funkcję autouzupełniania w tym działaniu wyszukiwania , które nakłada się klawiatura spowodowała problem, że użytkownik nie widział wyniku RecyclerView . Skończyło się na tym, że miałem ten EditText w moim układzie:

<EditText
  android:layout_width="match_parent"
  android:layout_height="?actionBarSize"
  android:id="@+id/main_search_et"
  android:imeOptions="actionSearch|flagNoExtractUi"
  android:inputType="text"  />

Twoje zdrowie!

Arefeh Iravanchi
źródło
5

Moje rozwiązanie:

android:imeOptions="flagNoExtractUi|flagNoFullscreen"
dastan
źródło
To jest bardziej aktualna odpowiedź.
alierdogan7
2

Możesz użyć :

android:imeOptions="flagNoFullscreen" 

w twoim tekście edycyjnym

Thientvse
źródło
1
Czy to odpowiedź?
artgb
Próbuję i to działa dla mnie! (Moje urządzenie to Android 4.1.2)
Thientvse
0

Możesz zadzwonić, aby ukryć miękką klawiaturę i wyczyścić fokus w widoku wyszukiwania.

public void hideKeyboard(View view) {
    InputMethodManager imm = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

super.clearFocus();
mohamed elagamy
źródło