Какое представление я использую при попытке скрыть клавиатуру?

Скажем, у меня есть несколько просмотров в одном макете, и я звоню:

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

имеет ли значение someView?

Я попробовал простой пример скрытия клавиатуры, но я не заметил никакой разницы в скрытии клавиатуры. Откуда возникают тонкие различия?

1 ответ

Кажется, это не имеет значения, на самом деле, пока это представление не будет из того же окна. Как указано в документации View.getWindowToken():

Получить уникальный токен, определяющий окно, к которому подключено это представление.

Все виды активности прикреплены к одному окну. Таким образом, вы получите один и тот же токен из каждого представления.

Однако, если у вас есть клавиатура, видимая и показывающая некоторый диалог. Предположим, что это диалоговое окно будет иметь пользовательский вид:

dialog_layout.xml

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content">
 </linearlayout><button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/tryHideKeyboard" android:text="Try hide keyboard">


 <p> <span>TestDialogFragment.java</span></p> <pre class="prettyprint linenums">public class TestDialogFragment extends DialogFragment {

 @Override
 public Dialog onCreateDialog(Bundle savedInstanceState) {
 final View view = LayoutInflater.from(getActivity()).inflate(R.layout.dialog_layout, null);

 view.findViewById(R.id.tryHideKeyboard).setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(final View v) {
 final InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
 imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
 }
 });

 // Use the Builder class for convenient dialog construction
 final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
 builder.setMessage("Test dialog")
 .setView(view)
 .setPositiveButton("OK", new DialogInterface.OnClickListener() {
 @Override
 public void onClick(final DialogInterface dialog, final int which) {
 // nothing to do
 }
 });
 // Create the AlertDialog object and return it
 return builder.create();
 }
}

Затем нажмите кнопку " Try hide keyboard в диалоговом окне (открытое в действии, например, EditText на основном макете и клавиатуре), клавиатура позади не будет закрыта, потому что в диалоговом окне есть собственное окно.

Поэтому я бы сказал, что нет, это не имеет значения, пока вы не попытаетесь закрыть клавиатуру из вида, которая прикреплена к другому окну (например, из всплывающего диалогового окна).

licensed under cc by-sa 3.0 with attribution.