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.

Mucha
źródło
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.

Skynet
źródło
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

Mucha
źródło
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.

Matthew556
źródło
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

AB
źródło
to ułatwiło mi życie stackoverflow.com/questions/9577304/…
Mohammed mansoor
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

Sonia John Kavery
źródło
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);
Lucyfer
źródło
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

kgsharathkumar
źródło
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.

AndroGeek
źródło
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);
Dharmaraj Patil
źródło
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

SMFazle Rabbi
źródło
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

NZXT
źródło
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);  
    }
});
user1213202
źródło
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.

Divyansh
źródło
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);
Priyanka
źródło
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)

Złota Rybka
źródło
1

Dla użytkowników platformy Xamarin:

[Activity(MainLauncher = true, 
        ScreenOrientation = ScreenOrientation.Portrait, 
        WindowSoftInputMode = SoftInput.StateHidden)] //SoftInput.StateHidden - disables keyboard autopop
Roy Doron
źródło
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"/>
NickUnuchek
źródło
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);
Ashish Sinha
źródło
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");
            }
        });
    }
    
slogan621
źródło
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();

indyfromoz
źródło
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>
Ajmal Salim
źródło
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;
    }
Android Chandigarh Reaston
źródło
0

Wypróbuj tę odpowiedź,

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

Uwaga: tylko dla API 11+

Ranjith Kumar
źródło
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;
}
Denis Raison
źródło
-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"

Alex Artemenko
źródło
-1

Proste, po prostu usuń tag „” z pliku xml

Jeyanth
źródło
2
Czy mógłbyś to rozwinąć i pokazać przykład. Zobacz, jak odpowiedzieć .
Błędy,
-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.

Sree
źródło
-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);

bieg
źródło
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