Android: automatycznie pokazuje miękką klawiaturę, gdy fokus jest ustawiony na EditText

341

Wyświetlam pole wprowadzania za pomocą AlertDialog. Samo EditTextokno dialogowe jest automatycznie ustawiane, gdy dzwonię AlertDialog.show(), ale klawiatura programowa nie jest automatycznie wyświetlana.

Jak ustawić automatyczne wyświetlanie klawiatury miękkiej, gdy wyświetlane jest okno dialogowe? (i nie ma fizycznej / sprzętowej klawiatury). Podobnie jak po naciśnięciu przycisku Wyszukaj, aby wywołać globalne wyszukiwanie, klawiatura programowa jest automatycznie wyświetlana.

Randy Sugianto „Yuku”
źródło
1
Powinno to nastąpić automatycznie, zgodnie z komentarzem Teda poniżej. Sprawdź to najpierw!
Cheezmeister,
Ta odpowiedź jest najprostsza i działa dobrze: stackoverflow.com/a/8018630/89818
caw
1
W ciągu kilku lat wróciłem do tej odpowiedzi kilka razy. Zawsze mam w tym dialogu problem, nigdy Fragment lub Aktywność.
tir38
Możliwy duplikat Zamknij / ukryj miękką klawiaturę Androida
Md Imran Choudhury

Odpowiedzi:

305

Można utworzyć ostrości słuchacza na EditTextsprawie AlertDialog, a następnie dostać AlertDialog„s Window. Stamtąd możesz wyświetlić miękką klawiaturę, dzwoniąc setSoftInputMode.

final AlertDialog dialog = ...;

editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        }
    }
});
Randy Sugianto „Yuku”
źródło
5
Jak miałbym to zrobić za pomocą AlertDialog.Builder? ... końcowy alert AlertDialog.Builder = nowy AlertDialog.Builder (Main.this);
Stephen
6
@Stephen można uzyskać okno dialogowe z konstruktora, używając, final AlertDialog dialog = builder.create()a następnie showw oknie dialogowym zamiast konstruktora.
tidbeck 11.10.11
30
CHCĘ PONOWNIE PRZECZYTAĆ SWÓJ KOMENTARZ Dowiedziałem się, że jeśli nie możesz dobrze skoncentrować się, spójrz na swój XML! Jeśli zobaczysz tam tag <requestFocus> </requestFocus> - usuń go. Wygląda na to, że tag skupi się na EditText, a wtedy twój słuchacz nie zostanie zwolniony, ponieważ EditText już jest aktywny.
Ted,
11
Jak tego nie zrobić, jeśli urządzenie ma klawiaturę sprzętową? Wydaje się, że jest to denerwujące dla tych użytkowników.
mxcl
8
Naprawdę nie rozumiem, dlaczego nie jest to domyślne zachowanie w zestawie SDK. Jeśli widok wymagający wprowadzania tekstu pokazuje migający kursor, dlaczego ktoś nie chce widzieć klawiatury do wprowadzania tekstu? Dla mnie to takie złe UX
Christian García
240

Aby wyświetlić użycie klawiatury:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

Aby ukryć użycie klawiatury:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(),0); 
horkavlna
źródło
3
Działa to szczególnie dobrze, gdy chcesz pokazać / ukryć miękką klawiaturę w oparciu o przełączanie widoczności widoku w swoim układzie między VISIBLE i GONE.
PacificSky,
38
Sugerowałbym zamiast tego użyć flagi SHOW_IMPLICIT, ponieważ oznacza to zmianę aktywności lub aplikacja automatycznie ukryje klawiaturę zgodnie z oczekiwaniami.
drspaceboo 10.04.13
6
@drspaceboo Korzystanie z SHOW_IMPLICIT w ogóle nie działa dla mnie, muszę użyć SHOW_FORCED, nie jestem pewien, dlaczego ...
Yoann Hercouet
1
Kiedy należy uruchomić powyższy kod? Próbowałem to zrobić wkrótce po dodaniu mojego układu do jego elementu nadrzędnego. To nie zadziałało. Ale jeśli zrobiłem to po tym, jak układ był już przez jakiś czas, to zadziałało. Czy istnieje funkcja oddzwaniania, która powie mi „Jeśli spróbujesz teraz wyświetlić klawiaturę, to faktycznie zadziała”?
William Jockusch,
1
toggleSoftInput (InputMethodManager.SHOW_FORCED, 0) przełącza klawiaturę programową. Jeśli chcesz się upewnić, że klawiatura się pojawi, możesz użyć imm.showSoftInput (widok, InputMethodManager.SHOW_IMPLICIT) zamiast tego, gdzie widok to Widok, który pobierze dane wejściowe.
PJ_Finnegan
111

Możesz poprosić o klawiaturę ekranową zaraz po utworzeniu okna dialogowego (test na SDK - r20)

// create dialog
final AlertDialog dialog = ...; 

// request keyboard   
dialog.getWindow().setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
Bao Le
źródło
Dla każdego, kto się zastanawia, ta metoda nie otwiera klawiatury miękkiej, gdy jest podłączona klawiatura sprzętowa. Właśnie przetestowałem za pomocą kabla USB On-The-Go. Doskonały!
13rac1
To nic dla mnie nie robi.
JohnyTex
Nie mam klawiatury sprzętowej. Może konfiguracja (?)
JohnyTex
25

Miałem ten sam problem i rozwiązałem go za pomocą następującego kodu. Nie jestem pewien, jak to będzie działać na telefonie z klawiaturą sprzętową.

// TextEdit
final EditText textEdit = new EditText(this);

// Builder
AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setTitle("Enter text");
alert.setView(textEdit);

alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        String text = textEdit.getText().toString();
        finish();
    }
});

alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        finish();
    }
});

// Dialog
AlertDialog dialog = alert.create();
dialog.setOnShowListener(new OnShowListener() {

    @Override
    public void onShow(DialogInterface dialog) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(textEdit, InputMethodManager.SHOW_IMPLICIT);
    }
});

dialog.show();
Tidbeck
źródło
Jest w klasie API Dialog na poziomie 8.
tidbeck
musiał zostać usunięty później: /
Jacek Kwiecień
@Xylian wciąż jest w dokumentacji Dialog.setOnShowListener ()
tidbeck
18
<activity
    ...
    android:windowSoftInputMode="stateVisible" >
</activity>

lub

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
ahtartam
źródło
Wielkie dzięki kolego, to było niesamowite, faktycznie użyłem obu z nich, aby rozwiązać mój problem, miałem sytuację, w której jeśli użytkownik jest w trybie dodawania, to muszę pokazać klawiaturę na początku aktywności, a dla trybu aktualizacji nie jest wymagana klawiatura domyślnie. Tak więc w manifestie dla aktywności ustawiłem, stateHiddena kiedy wykryłem, że użytkownik tworzy nowy element, wyświetliłem klawiaturę, używając wspomnianej linii kodu. :) Jeszcze raz dziękuję.
PHP Avenger
Otrzymuję komunikat „nie można rozwiązać problemu z getWindow ()”. próbowałem umieścić „to”. i inne rzeczy wcześniej. chcę uzyskać klawiaturę bez użycia tekstu edycyjnego, po prostu klikając określoną część ekranu.
Androidcoder
1
@Androidcoder, jest częścią działania, więc dodaj coś takiego ((Activity) context).getWindow().....
CoolMind,
15

Fragmenty kodu z innych odpowiedzi działają, ale nie zawsze jest oczywiste, gdzie umieścić je w kodzie, szczególnie jeśli używasz AlertDialog.Builderi postępowałeś zgodnie z oficjalnym samouczkiem dialogowym, ponieważ nie używa on final AlertDialog ...lub alertDialog.show().

alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

Lepiej jest

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

Ponieważ SOFT_INPUT_STATE_ALWAYS_VISIBLE ukryje klawiaturę, jeśli fokus przełączy się z EditText, gdzie SHOW_FORCED będzie wyświetlał klawiaturę do momentu jej jawnego zwolnienia, nawet jeśli użytkownik powróci do ekranu głównego lub wyświetli najnowsze aplikacje.

Poniżej znajduje się działający kod dla AlertDialog utworzonego przy użyciu niestandardowego układu z EditText zdefiniowanym w XML. Ustawia również klawiaturę na klawisz „go” i pozwala na uruchomienie przycisku dodatniego.

alert_dialog.xml:

<RelativeLayout
android:id="@+id/dialogRelativeLayout"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" >

    <!-- android:imeOptions="actionGo" sets the keyboard to have a "go" key instead of a "new line" key. -->
    <!-- android:inputType="textUri" disables spell check in the EditText and changes the "go" key from a check mark to an arrow. -->
    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:layout_marginLeft="4dp"
        android:layout_marginRight="4dp"
        android:layout_marginBottom="16dp"
        android:imeOptions="actionGo"
        android:inputType="textUri"/>

</RelativeLayout>

AlertDialog.java:

import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatDialogFragment;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.widget.EditText;

public class CreateDialog extends AppCompatDialogFragment {
    // The public interface is used to send information back to the activity that called CreateDialog.
    public interface CreateDialogListener {
        void onCreateDialogCancel(DialogFragment dialog);    
        void onCreateDialogOK(DialogFragment dialog);
    }

    CreateDialogListener mListener;

    // Check to make sure that the activity that called CreateDialog implements both listeners.
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mListener = (CreateDialogListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement CreateDialogListener.");
        }
    }

    // onCreateDialog requires @NonNull.
    @Override
    @NonNull
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity());
        LayoutInflater customDialogInflater = getActivity().getLayoutInflater();

        // Setup dialogBuilder.
        alertDialogBuilder.setTitle(R.string.title);
        alertDialogBuilder.setView(customDialogInflater.inflate(R.layout.alert_dialog, null));
        alertDialogBuilder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                mListener.onCreateDialogCancel(CreateDialog.this);
            }
        });
        alertDialogBuilder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                mListener.onCreateDialogOK(CreateDialog.this);
            }
        });

        // Assign the resulting built dialog to an AlertDialog.
        final AlertDialog alertDialog = alertDialogBuilder.create();

        // Show the keyboard when the dialog is displayed on the screen.
        alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

        // We need to show alertDialog before we can setOnKeyListener below.
        alertDialog.show();

        EditText editText = (EditText) alertDialog.findViewById(R.id.editText);

        // Allow the "enter" key on the keyboard to execute "OK".
        editText.setOnKeyListener(new View.OnKeyListener() {
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                // If the event is a key-down event on the "enter" button, select the PositiveButton "OK".
                if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
                    // Trigger the create listener.
                    mListener.onCreateDialogOK(CreateDialog.this);

                    // Manually dismiss alertDialog.
                    alertDialog.dismiss();

                    // Consume the event.
                    return true;
                } else {
                    // If any other key was pressed, do not consume the event.
                    return false;
                }
            }
        });

        // onCreateDialog requires the return of an AlertDialog.
        return alertDialog;
    }
}
Soren Stoutner
źródło
11

Cóż, to dość stary post, wciąż jest coś do dodania.
Są 2 proste metody, które pomagają mi kontrolować klawiaturę i działają one idealnie:

Pokaż klawiaturę

public void showKeyboard() {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    View v = getCurrentFocus();
    if (v != null)
        imm.showSoftInput(v, 0);
}

Ukryj klawiaturę

public void hideKeyboard() {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    View v = getCurrentFocus();
    if (v != null)
        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
sberezin
źródło
Co to jest getCurrentFocus()?
CoolMind,
Rozumiem, to metoda Activity.
CoolMind,
10

Pozwól mi wskazać dodatkowe informacje na temat rozwiązania yuku, ponieważ trudno mi było uruchomić to! Jak uzyskać obiekt AlertDialog z mojego AlertDialog.Builder? To wynik mojej alert.show()egzekucji:

final AlertDialog.Builder alert = new AlertDialog.Builder(getActivity());
final EditText input = new EditText(getActivity());
alert.setView(input);

// do what you need, like setting positive and negative buttons...

final AlertDialog dialog = alert.show();

input.setOnFocusChangeListener(new OnFocusChangeListener() {
   @Override
   public void onFocusChange(View v, boolean hasFocus) {
      if(hasFocus) {
         dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
      }
   }
});
użytkownik1344313
źródło
7

Spójrz na dyskusję, która obsługuje ręczne ukrywanie i pokazywanie edytora IME. Mam jednak wrażenie, że jeśli fokus EditTextnie wyświetla IME, dzieje się tak dlatego, że wywołujesz AlertDialog.show()swoją OnCreate()lub inną metodę, która jest wywoływana przed wyświetleniem ekranu. OnPostResume()Wierzę, że przeniesienie go do powinno to naprawić.

jqpubliq
źródło
6

Tak, możesz to zrobić setOnFocusChangeListener, pomoże ci.

editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        }
    }
});
Sachin Surjan
źródło
4

Wiem, że to pytanie jest stare, ale myślę, że użycie funkcji rozszerzenia jest ładniejszym sposobem pokazania klawiatury do edycji tekstu

Oto metoda, której używam do wyświetlania klawiatury dla tekstu edycji.

kod kotlin: wystarczy zadzwonićedittext.showKeyboard()

fun EditText.showKeyboard() {
  post {
    requestFocus()
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
  }
}

kod Java:

public static void showKeyboard(EditText editText) {
    editText.post(new Runnable() {
      @Override
      public void run() {
        editText.requestFocus();
        InputMethodManager imm = (InputMethodManager) editText.getContext()
            .getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
      }
    });
  }
A.easazadeh
źródło
3

Jeśli ktoś otrzymuje:

Nie można dokonać statycznego odwołania do metody niestatycznej getSystemService (String) z typu Activity

Spróbuj dodać kontekst do wywołania getSystemService.

Więc

InputMethodManager imm = 
(InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
Ryan Wittenburg
źródło
1

Oryginalne pytanie dotyczy okien dialogowych, a mój tekst EditText jest wyświetlany regularnie. W każdym razie podejrzewam, że to powinno zadziałać także dla większości z was. Oto, co działa dla mnie (wyżej sugerowana metoda najwyżej oceniona nic dla mnie nie zrobiła). Oto niestandardowy EditView, który to robi (podklasowanie nie jest konieczne, ale uznałem, że jest to wygodne dla moich celów, ponieważ chciałem również skupić się, gdy widok staje się widoczny).

W rzeczywistości jest to w dużej mierze to samo, co odpowiedź na pytanie. Właściwie wcale nie zauważyłem jego odpowiedzi, ponieważ miała zero głosów. Potem miałem właśnie skomentować jego post, ale byłoby to zbyt długo, więc i tak przestałem to robić. Tidbeck podkreśla, że ​​nie jest pewien, jak to działa z urządzeniami wyposażonymi w klawiatury. Mogę potwierdzić, że zachowanie wydaje się dokładnie takie samo w obu przypadkach. Jest to spowodowane tym, że w trybie pionowym klawiatura programowa się wysuwa, a w trybie poziomym nie. Wysuwanie się fizycznej klawiatury nie ma znaczenia w moim telefonie.

Bo ja osobiście uważam zachowanie nieco niewygodne Zdecydowałem się przy użyciu: InputMethodManager.SHOW_FORCED. Działa tak, jak chciałem. Klawiatura staje się widoczna niezależnie od orientacji, jednak przynajmniej na moim urządzeniu nie wyskakuje, jeśli klawiatura sprzętowa została wysunięta.

import android.app.Service;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;

public class BringOutTheSoftInputOnFocusEditTextView extends EditText {

    protected InputMethodManager inputMethodManager;

    public BringOutTheSoftInputOnFocusEditTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    public BringOutTheSoftInputOnFocusEditTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public BringOutTheSoftInputOnFocusEditTextView(Context context) {
        super(context);
        init();
    }

    private void init() {
        this.inputMethodManager = (InputMethodManager)getContext().getSystemService(Service.INPUT_METHOD_SERVICE);
        this.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (hasFocus) {
                    BringOutTheSoftInputOnFocusEditTextView.this.inputMethodManager.showSoftInput(BringOutTheSoftInputOnFocusEditTextView.this, InputMethodManager.SHOW_FORCED);
                }
            }
        });
    }

    @Override
    protected void onVisibilityChanged(View changedView, int visibility) {
        super.onVisibilityChanged(changedView, visibility);
        if (visibility == View.VISIBLE) {
            BringOutTheSoftInputOnFocusEditTextView.this.requestFocus();
        }
    }

}
Timo
źródło
1

Problemem wydaje się być to, że ponieważ miejsce, w którym wpisujesz tekst, jest początkowo ukryte (albo zagnieżdżone, czy coś takiego), AlertDialog automatycznie ustawia flagę WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IMlub w ten WindowManager.LayoutParams.FLAG_NOT_FOCUSABLEsposób, że rzeczy nie wyzwalają miękkiego wejścia do wyświetlenia.

Aby to naprawić, dodaj następujące elementy:

(...)
// Create the dialog and show it
Dialog dialog = builder.create()
dialog.show();

// After show (this is important specially if you have a list, a pager or other view that uses a adapter), clear the flags and set the soft input mode
dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
Allan Veloso
źródło
1

spróbuj i użyj:

editText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
ungalcrys
źródło
1

Aby wyświetlić klawiaturę, musiałem wykonać następujące czynności

Android TextField: programowo ustaw ostrość + miękkie wprowadzanie

Zasadniczo rozwiązanie jest następujące

@Override
public void onResume() {
    super.onResume();
    //passwordInput.requestFocus(); <-- that doesn't work
    passwordInput.postDelayed(new ShowKeyboard(), 325); //250 sometimes doesn't run if returning from LockScreen
}

Gdzie ShowKeyboardjest

private class ShowKeyboard implements Runnable {
    @Override
    public void run() {
        passwordInput.setFocusableInTouchMode(true);
        //passwordInput.requestFocusFromTouch(); //this gives touch event to launcher in background -_-
        passwordInput.requestFocus();
        getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        ((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(passwordInput, 0);
    }
}

Po udanym wprowadzeniu upewniam się również, że ukryłem klawiaturę

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE))
                    .hideSoftInputFromWindow(getView().getWindowToken(), 0);
EpicPandaForce
źródło
1

Umieść te metody w swojej klasie Util i używaj ich w dowolnym miejscu.

Kotlin

fun hideKeyboard(activity: Activity) {
    val view = activity.currentFocus
    val methodManager = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(view != null)
    methodManager.hideSoftInputFromWindow(view!!.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
}

private fun showKeyboard(activity: Activity) {
    val view = activity.currentFocus
    val methodManager = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(view != null)
    methodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
}

Jawa

public static void hideKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager methodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    assert methodManager != null && view != null;
    methodManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}

private static void showKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager methodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    assert methodManager != null && view != null;
    methodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
}
Khemraj
źródło
1

Stworzyłem ładne funkcje rozszerzenia kotlin-esqe, jeśli ktoś jest zainteresowany

fun Activity.hideKeyBoard() {
    val view = this.currentFocus
    val methodManager = this.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(view != null)
    methodManager.hideSoftInputFromWindow(view!!.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
}

fun Activity.showKeyboard() {
    val view = this.currentFocus
    val methodManager = this.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(view != null)
    methodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
}
jestem E.
źródło
0

To jest dobra próbka dla Ciebie:

<?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" >

    <ScrollView
        android:id="@+id/scrollID"
        android:layout_width="fill_parent"
        android:layout_height="0dip"
        android:layout_weight="1" >

        <LinearLayout
            android:id="@+id/test"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >
        </LinearLayout>
    </ScrollView>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:baselineAligned="true"
        android:orientation="horizontal"
        android:paddingBottom="5dp"
        android:paddingLeft="5dp"
        android:paddingRight="5dp"
        android:weightSum="1" >

        <EditText
            android:id="@+id/txtInpuConversation"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="0.5"
            android:hint="@string/edt_Conversation" >

            <requestFocus />
        </EditText>

        <Button
            android:id="@+id/btnSend"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="0.5"
            android:text="@string/btn_Conversation" />
    </LinearLayout>

</LinearLayout>
AA
źródło
0

Dlaczego ta odpowiedź - Ponieważ powyższe rozwiązanie pokaże klawiaturę, ale nie zniknie, jeśli klikniesz gdziekolwiek indziej EditText. Musisz więc zrobić coś, aby klawisz klawiatury zniknął, gdy EditTextstraci ostrość.

Możesz to osiągnąć, wykonując następujące czynności:

  1. Ustaw widok nadrzędny (widok zawartości Twojej aktywności), na który można kliknąć, i można go ustawić, dodając następujące atrybuty

        android:clickable="true" 
        android:focusableInTouchMode="true" 
  2. Zaimplementuj metodę hideKeyboard ()

        public void hideKeyboard(View view) {
            InputMethodManager inputMethodManager =(InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE);
            inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(),InputMethodManager.HIDE_IMPLICIT_ONLY );
        }
  3. Na koniec ustaw onFocusChangeListener swojego tekstu edytującego.

        edittext.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (!hasFocus) {
                    hideKeyboard(v);
                }
            }
        });
Darpan
źródło
0

To trochę trudne. Zrobiłem w ten sposób i zadziałało.

1. Pierwsze połączenie, aby ukryć miękkie wejście z okna. To ukryje miękkie wejście, jeśli miękka klawiatura jest widoczna lub nie rób nic, jeśli nie jest.

2. Pokaż swoje okno dialogowe

3. Następnie wystarczy zadzwonić, aby przełączyć miękkie wprowadzanie.

kod:

InputMethodManager inputManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
//hiding soft input
inputManager.hideSoftInputFromWindow(findViewById(android.R.id.content).getWind‌​owToken(), 0);
//show dialog
yourDialog.show();
//toggle soft input
inputManager.toggleSoftInput(InputMethodManager.SHOW_FORCED,InputMethodManager.SHOW_IMPLICIT);
FRR
źródło
0

Spróbuj tego

SomeUtils.java

public static void showKeyboard(Activity activity, boolean show) {
    InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);

    if(show)
        inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
    else
        inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY,0);
}
GameBug
źródło
0

Próbowałem wielu, ale to właśnie dla mnie zadziałało (kotlin):

        val dialog = builder.create()
        dialog.setOnShowListener {
            nameEditText.requestFocus()
            val s = ContextCompat.getSystemService(requireContext(), InputMethodManager::class.java)
            s?.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0)
        }

        dialog.setOnDismissListener {
            val s = ContextCompat.getSystemService(requireContext(), InputMethodManager::class.java)
            s?.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0)
        }

        dialog.show()
Lorenzo
źródło
0

Patrząc na https://stackoverflow.com/a/39144104/2914140 uprościłem trochę:

// In onCreateView():
view.edit_text.run {
    requestFocus()
    post { showKeyboard(this) }
}

fun showKeyboard(view: View) {
    val imm = view.context.getSystemService(
        Context.INPUT_METHOD_SERVICE) as InputMethodManager?
    imm?.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
}

Jest lepszy niż https://stackoverflow.com/a/11155404/2914140 :

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

ponieważ po naciśnięciu przycisku Strona główna i przejściu do ekranu głównego klawiatura pozostanie otwarta.

CoolMind
źródło
-1
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

Wywołuję to w funkcji onCreate (), aby automatycznie wyświetlać klawiaturę po wejściu w działanie.

Raul Yang
źródło