Jak wyłączyć wyskakujące okienko klawiatury w edytorze?


85

W mojej aplikacji pierwszym widokiem wszystkich moich ekranów jest EditText, więc za każdym razem, gdy przechodzę do ekranu, pojawia się klawiatura ekranowa. jak mogę wyłączyć to wyskakujące okienko i włączyć je po ręcznym kliknięciu na EditText ????

    eT = (EditText) findViewById(R.id.searchAutoCompleteTextView_feed);

    eT.setOnFocusChangeListener(new OnFocusChangeListener() {

        public void onFocusChange(View v, boolean hasFocus) {

            if(hasFocus){
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
            imm.hideSoftInputFromWindow(eT.getWindowToken(), 0);
            }
        }
    });

kod xml:

<ImageView
    android:id="@+id/feedPageLogo"
    android:layout_width="45dp"
    android:layout_height="45dp"
    android:src="@drawable/wic_logo_small" />

<Button
    android:id="@+id/goButton_feed"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:text="@string/go" />

<EditText
    android:id="@+id/searchAutoCompleteTextView_feed"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_toLeftOf="@id/goButton_feed"
    android:layout_toRightOf="@id/feedPageLogo"
    android:hint="@string/search" />

<TextView
    android:id="@+id/feedLabel"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_below="@id/feedPageLogo"
    android:gravity="center_vertical|center_horizontal"
    android:text="@string/feed"
    android:textColor="@color/white" />

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ButtonsLayout_feed"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true" >

    <Button
        android:id="@+id/feedButton_feed"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_margin="0dp"
        android:layout_weight="1"
        android:background="@color/white"
        android:text="@string/feed"
        android:textColor="@color/black" />

    <Button
        android:id="@+id/iWantButton_feed"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_margin="0dp"
        android:layout_weight="1"
        android:background="@color/white"
        android:text="@string/iwant"
        android:textColor="@color/black" />

    <Button
        android:id="@+id/shareButton_feed"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_margin="0dp"
        android:layout_weight="1"
        android:background="@color/white"
        android:text="@string/share"
        android:textColor="@color/black" />

    <Button
        android:id="@+id/profileButton_feed"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_margin="0dp"
        android:layout_weight="1"
        android:background="@color/white"
        android:text="@string/profile"
        android:textColor="@color/black" />
</LinearLayout>

<ListView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/feedListView"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_above="@id/ButtonsLayout_feed"
    android:layout_below="@id/feedLabel"
    android:textSize="15dp" >
</ListView>

w trzecim widoku (EditText) jest fokus.


możesz wysłać swój kod xml. w pełni.
user1213202

Odpowiedzi:


178

Najlepsze rozwiązanie znajduje się w pliku manifestu projektu (AndroidManifest.xml) , dodaj następujący atrybut w activitykonstrukcji

android: windowSoftInputMode = "stateHidden"


Przykład:

    <activity android:name=".MainActivity" 
              android:windowSoftInputMode="stateHidden" />

Opis:

  • Stan miękkiej klawiatury - czy jest ukryta, czy widoczna - kiedy czynność staje się centrum uwagi użytkownika.
  • Korekta dokonana w oknie głównym działania - czy jest ono zmniejszane, aby zrobić miejsce na klawiaturę ekranową, czy też jego zawartość przesuwa się, aby bieżący fokus był widoczny, gdy część okna jest zakryta przez klawiaturę ekranową.

Wprowadzono w:

  • Poziom API 3.

Link do dokumentów

Uwaga: wartości ustawione w tym miejscu (inne niż „stateUnspecified” i „adjustUnspecified”) zastępują wartości ustawione w kompozycji.


3
To podejście nie powiedzie się, jeśli masz w działaniu mieszankę pól tekstowych, dla niektórych których chcesz mieć klawiaturę, a dla innych nie. Zobacz moją odpowiedź, jak można to osiągnąć na podstawie pola tekstowego w takim scenariuszu.
slogan621

@ slogan621, poświęć chwilę na zrozumienie pytania. Jesteś na innej stycznej!
Skynet

1
nie działa, gdy otwieram moją aplikację od niedawna.
Mohd Naushad

83

Musisz utworzyć widok nad tekstem edycji, który ma `` fałszywy '' fokus:

Coś jak :

<!-- Stop auto focussing the EditText -->
<LinearLayout
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:background="@android:color/transparent"
    android:focusable="true"
    android:focusableInTouchMode="true">
</LinearLayout>

<EditText
    android:id="@+id/searchAutoCompleteTextView_feed"
    android:layout_width="200dp"
    android:layout_height="wrap_content"
    android:inputType="text" />

W tym przypadku użyłem LinearLayout, aby zażądać fokusu. Mam nadzieję że to pomoże.

To działało idealnie ... dzięki Zaggo0


26
Dodanie bezużytecznego widoku jest nieoptymalnym rozwiązaniem w porównaniu z dodaniem android: windowSoftInputMode = "stateHidden" do wpisu manifestu działania.
Chris Horner,

@ChrisHorner w obu, które musisz określić dla działania lub układu ... to ta sama irytująca rzecz ... oba działają dobrze w tym rozwiązaniu.
Nicolas Jafelle

2
Wypróbowałem wszystkie rozwiązania i tylko to działa poprawnie! dzięki jasne i proste
alfo888_ibg

Dodanie bezużytecznego widoku nie jest dobrym pomysłem, jak powiedział @ChrisHorner, lepiej dodaj atrybut do pliku manifestu zgodnie z jego sugestią lub dodaj ten wiersz kodu do swojej aktywności InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
aB9

1
Taka zła implementacja hierarchii widoku! Myślę, że należy tego unikać, jeśli to możliwe.
sud007

43
     edittext.setShowSoftInputOnFocus(false);

Teraz możesz używać dowolnej niestandardowej klawiatury.


Dzięki, to jedyne rozwiązanie, które u mnie działa + jest krótkie i łatwe.
Max O.

20
jest dostępny od poziomu API 21
Jithu PS

To jest to, czego szukałem.
Sanjay Joshi,

@ JithuP.S, dlaczego działa na tytanie Karbon, którego poziom API wynosi 19?
尤金寶 漢子

23

Ludzie sugerowali tutaj wiele świetnych rozwiązań, ale użyłem tej prostej techniki z moim EditTextem (nic nie jest wymagane w Javie i AnroidManifest.xml). Po prostu ustaw focusable i focusableInTouchMode na false bezpośrednio w EditText.

 <EditText
        android:id="@+id/text_pin"
        android:layout_width="136dp"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:textAlignment="center"
        android:inputType="numberPassword"
        android:password="true"
        android:textSize="24dp"
        android:focusable="false"
        android:focusableInTouchMode="false"/>

Moim zamiarem jest tutaj użycie tego pola edycji w działaniu blokady aplikacji, w którym proszę użytkownika o wprowadzenie kodu PIN i chcę pokazać mój niestandardowy PIN pad. Testowane z minSdk = 8 i maxSdk = 23 w Android Studio 2.1

wprowadź opis obrazu tutaj



20

Dodaj poniższy kod do swojej klasy aktywności.

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

Klawiatura pojawi się, gdy użytkownik kliknie EditText


10

Możesz użyć następującego kodu, aby wyłączyć Klawiaturę ekranową.

InputMethodManager im = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
im.hideSoftInputFromWindow(editText.getWindowToken(), 0);

1
i mogę włączyć go ponownie, używając EditText.onClick (im.unhideSoftInputFromWindow (editText.getWindowToken (), 0);) lub coś takiego?
Housefly

8

Dwa proste rozwiązania:

Pierwsze rozwiązanie jest dodawane poniżej linii kodu w pliku manifestu xml. W pliku manifestu (AndroidManifest.xml) dodaj następujący atrybut w konstrukcji działania

android: windowSoftInputMode = "stateHidden"

Przykład:

<activity android:name=".MainActivity" 
          android:windowSoftInputMode="stateHidden" />

Drugie rozwiązanie polega na dodaniu poniższego wiersza kodu w aktywności

//Block auto opening keyboard  
  this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

Możemy użyć jednego z powyższych rozwiązań. Dzięki


5

Zadeklaruj zmienną globalną dla InputMethodManager:

 private InputMethodManager im ;

W onCreate () zdefiniuj to:

 im = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
 im.hideSoftInputFromWindow(youredittext.getWindowToken(), 0);

Ustaw onClickListener na ten tekst edycji wewnątrz oncreate ():

 youredittext.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        im.showSoftInput(youredittext, InputMethodManager.SHOW_IMPLICIT);
    }
});

To zadziała.


Wpisz swój kod. Co otrzymujesz podczas wykonywania.
AndroGeek

cały kod jest w pytaniu, klawiatura ekranowa nie wyświetla się, gdy klikam tekst edycji
Housefly

Czy testujesz to za pomocą emulatora lub urządzenia. Jeśli spróbujesz tego za pomocą emulatora, nie otrzymasz klawiszy programowych. Przetestuj za pomocą urządzenia. To będzie działać.
AndroGeek

tak, używam urządzenia do testowania
Housefly

Hmmm to dziwne. Gdybyś mógł opublikować swój kod, metoda, w której napisałeś, mogłaby być pomocna. Albo powyższy kod działa absolutnie dobrze na moim urządzeniu.
AndroGeek

4

Użyj poniższego kodu, zapisz go pod onCreate()

InputMethodManager inputManager = (InputMethodManager)
                                   getSystemService(Context.INPUT_METHOD_SERVICE); 
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),
                                   InputMethodManager.HIDE_NOT_ALWAYS);         
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

4

spróbuj ....... rozwiązuję ten problem za pomocą kodu: -

EditText inputArea;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
inputArea = (EditText) findViewById(R.id.inputArea);

//This line is you answer.Its unable your click ability in this Edit Text
//just write
inputArea.setInputType(0);
}

nic nie możesz wprowadzić domyślnie kalkulatora na cokolwiek, ale możesz ustawić dowolny ciąg.

Spróbuj


3

Dzięki @AB za dobre rozwiązanie

    android:focusableInTouchMode="false"

w tym przypadku, jeśli wyłączysz klawiaturę w edycji tekstu, po prostu dodaj android: focusableInTouchMode = "false" w sloganie edittext.

działa dla mnie w Android Studio 3.0.1 minsdk 16, maxsdk26


1
Czy to komentarz do A.Bodpowiedzi? Czy jest to odpowiedź na pierwotne pytanie? Jeśli jest to komentarz do A.Bodpowiedzi, należy użyć opcji komentarza udostępnionej przez StackOverflow i usunąć tę odpowiedź na pierwotne pytanie.
David Walschots,

przepraszam, jeśli nie rozumiem, aby odpowiedzieć na rozwiązaną odpowiedź. dziękuję firmie AB za dobrą odpowiedź, aby rozwiązać mój problem .. jeśli się mylę, mogę usunąć tę odpowiedź, przepraszam @DavidWalschots.
NZXT

2

Spróbuj z tym:

EditText yourEditText= (EditText) findViewById(R.id.yourEditText); 
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT); 

Aby zamknąć, możesz użyć:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
 imm.hideSoftInputFromWindow(yourEditText.getWindowToken(), 0); 

Spróbuj tak w swoim kodzie:

ed = (EditText)findViewById(R.id.editText1);

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);  
imm.hideSoftInputFromWindow(ed.getWindowToken(), 0);  

ed.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);  
        imm.showSoftInput(ed, InputMethodManager.SHOW_IMPLICIT);  
    }
});

działa w taki sam sposób, jak poprzednio .... są jakieś zmiany, które muszę zrobić w układzie ??? dla tego widoku EditText ??
Housefly

okej, teraz działa po dodaniu kilku atrybutów układu ... android: clickable = "true" android: cursorVisible = "false" android: focusable = "false" dziękuję
Housefly

no.do one thing. napisz ukrywanie kodu klawiatury w metodzie edittext.setOnFocusChangeListener () i spróbuj
user1213202

byłoby to rozwiązanie, JEŚLI mógłbyś dokładnie określić, kiedy użyć wywołania hideSoftInput. klawiatura wyskakuje automatycznie PO onCreate i onResume
ahmet emrah

2

Cóż, miałem ten sam problem i właśnie poradziłem sobie z fokusem w pliku XML.

<EditText
            android:cursorVisible="false"
            android:id="@+id/edit"
            android:focusable="false"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

Prawdopodobnie szukasz również bezpieczeństwa. To również w tym pomoże.


1

Użyj następującego kodu w swojej onCreate()metodzie-

    editText = (EditText) findViewById(R.id.editText);
    editText.requestFocus();
    editText.postDelayed(new Runnable() {
        public void run() {
            InputMethodManager keyboard = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            keyboard.hideSoftInputFromWindow(
                    editText.getWindowToken(), 0);
        }
    }, 200);

1

Jedyne, co musisz zrobić, to dodać android:focusableInTouchMode="false"do EditText w XML i to wszystko (jeśli ktoś nadal musi wiedzieć, jak to zrobić w łatwy sposób)


1

Dla użytkowników platformy Xamarin:

[Activity(MainLauncher = true, 
        ScreenOrientation = ScreenOrientation.Portrait, 
        WindowSoftInputMode = SoftInput.StateHidden)] //SoftInput.StateHidden - disables keyboard autopop

1
       <TextView android:layout_width="match_parent"
                 android:layout_height="wrap_content"

                 android:focusable="true"
                 android:focusableInTouchMode="true">

                <requestFocus/>
      </TextView>

      <EditText android:layout_width="match_parent"
                android:layout_height="wrap_content"/>

1

Jeśli korzystasz z platformy Xamarin, możesz to dodać

Activity[(WindowSoftInputMode = SoftInput.StateAlwaysHidden)]

następnie możesz dodać tę linię w metodzie OnCreate ()

youredittext.ShowSoftInputOnFocus = false;

Jeśli docelowe urządzenie nie obsługuje powyższego kodu, możesz użyć poniższego kodu w zdarzeniu kliknięcia EditText

InputMethodManager Imm = (InputMethodManager)this.GetSystemService(Context.InputMethodService);
Imm.HideSoftInputFromWindow(youredittext.WindowToken, HideSoftInputFlags.None);

1

Znalazłem następujący wzorzec, który działa dobrze dla mnie w kodzie, w którym chcę pokazać okno dialogowe, aby uzyskać dane wejściowe (np. Ciąg wyświetlany w polu tekstowym jest wynikiem wyborów dokonanych z listy pól wyboru w oknie dialogowym, a nie tekst wprowadzany za pomocą klawiatury).

  1. Wyłącz fokus wprowadzania miękkiego w polu edycji. Nie mogę wyłączyć dla całej czynności, ponieważ istnieją pola edycji, w których chcę, aby klawiatura była używana w tym samym układzie.
  2. Pierwsze kliknięcia w polu tekstowym powodują zmianę fokusu, a powtórne kliknięcie - zdarzenie kliknięcia. Więc nadpisuję oba (tutaj nie refaktoryzuję kodu, aby zilustrować, że oba programy obsługujące robią to samo):

    tx = (TextView) m_activity.findViewById(R.id.allergymeds);
    if (tx != null) {
        tx.setShowSoftInputOnFocus(false);
        tx.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View view, boolean hasFocus) {
                if (hasFocus) {
                    MedicationsListDialogFragment mld = new MedicationsListDialogFragment();
                    mld.setPatientId(m_sess.getActivePatientId());
                    mld.show(getFragmentManager(), "Allergy Medications Dialog");
                }
            }
        });
        tx.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                MedicationsListDialogFragment mld = new MedicationsListDialogFragment();
                mld.setPatientId(m_sess.getActivePatientId());
                mld.show(getFragmentManager(), "Allergy Medications Dialog");
            }
        });
    }
    

0

W aplikacji na Androida, którą budowałem, miałem trzy EditTextsekundy w LinearLayoutukładzie poziomym. Musiałem zapobiec pojawianiu się miękkiej klawiatury po załadowaniu fragmentu. Oprócz ustawienia focusablei focusableInTouchModena true po LinearLayoutmusiałem zestaw descendantFocusabilitydo blocksDescendants. W onCreate, zadzwoniłem requestFocusdoLinearLayout . Zapobiegało to pojawianiu się klawiatury podczas tworzenia fragmentu.

Układ -

    <LinearLayout
       android:id="@+id/text_selector_container"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:weightSum="3"
       android:orientation="horizontal"
       android:focusable="true"
       android:focusableInTouchMode="true"
       android:descendantFocusability="blocksDescendants"
       android:background="@color/black">

       <!-- EditText widgets -->

    </LinearLayout>

W onCreate-mTextSelectorContainer.requestFocus();


0

Jeśli ktoś nadal szuka najłatwiejszego rozwiązania, ustaw następujący atrybut na truew układzie nadrzędnym

android:focusableInTouchMode="true"

Przykład:

<android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:focusableInTouchMode="true">

.......
......
</android.support.constraint.ConstraintLayout>

poniżej wyborców, proszę skomentuj swoje argumenty przed oddaniem głosów!
Ajmal Salim

0

Użyj tego, aby włączyć i wyłączyć EditText ....

InputMethodManager imm;

imm = (InputMethodManager)
getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);

if (isETEnable == true) {

    imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
    ivWalllet.setImageResource(R.drawable.checkbox_yes);
    etWalletAmount.setEnabled(true);
    etWalletAmount.requestFocus();
    isETEnable = false;
    } 
else {

    imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY,0);
    ivWalllet.setImageResource(R.drawable.checkbox_unchecked);
    etWalletAmount.setEnabled(false);
    isETEnable = true;
    }

0

Wypróbuj tę odpowiedź,

editText.setRawInputType(InputType.TYPE_CLASS_TEXT);
editText.setTextIsSelectable(true);

Uwaga: tylko dla API 11+


0
private InputMethodManager imm;

...


editText.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        v.onTouchEvent(event);
        hideDefaultKeyboard(v);
        return true;
    }
});

private void hideDefaultKeyboard(View et) {
  getMethodManager().hideSoftInputFromWindow(et.getWindowToken(), 0);
}

private InputMethodManager getMethodManager() {
        if (this.imm == null) {
            this.imm = (InputMethodManager)  getContext().getSystemService(android.content.Context.INPUT_METHOD_SERVICE);
        }
  return this.imm;
}

-1

dla dowolnego widoku tekstu w Twojej działalności (lub utwórz fałszywy pusty widok tekstu za pomocą android: layout_width = "0dp" android: layout_height = "0dp") i dodaj do tego widoku tekstowego next: android: textIsSelectable = "true"



-1

Wystarczy dodać właściwość, android:focusable="false"w szczególności EditTextw formacie XML układu. Następnie możesz napisać lister kliknięć EditTextbez wyskakującego okienka klawiatury.


-1

Problem można posortować za pomocą, Nie ma potrzeby ustawiania editText inputType na żadne wartości, wystarczy dodać poniższą linię, editText.setTextIsSelectable (true);


Hej, dzięki za napisanie odpowiedzi! Ponieważ jednak jest tu już tak wiele odpowiedzi, może być jeszcze bardziej pomocne, jeśli faktycznie napisałeś to jako komentarz do odpowiedzi Ranjitha Kumara, zamiast traktować to jako własną odpowiedź. Warto również wspomnieć, jaki inputTypebyłby skutek pominięcia tego . Ale wygląda na to, że dobrze byłoby wiedzieć, gdybym poszedł z inną odpowiedzią, więc nawet jeśli nalegasz, aby zachować to jako własną odpowiedź, i tak rozważ pozostawienie tam komentarza.
Mark
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.