Android 소프트 키보드를 프로그래밍 방식으로 닫거나 숨기는 방법은 무엇입니까?
나는 있습니다.EditText
a 리고a.Button
나의 배치에.
▁on▁the▁and후▁writing클한▁after릭▁field▁clicking▁in▁edit▁the를 클릭한 후Button
키보드 외부를 터치할 때 가상 키보드를 숨기고 싶습니다.이것은 단순한 코드 조각이라고 생각합니다만, 어디에서 예제를 찾을 수 있습니까?
Android가 InputMethodManager를 사용하여 가상 키보드를 숨기도록 강제할 수 있습니다. 집중된 보기가 포함된 창의 토큰을 호출하고 전달합니다.
// Check if no view has focus:
View view = this.getCurrentFocus();
if (view != null) {
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
그러면 모든 상황에서 키보드가 숨겨집니다.경우에 따라, 당신은 당신을 넘겨주기를 원할 것입니다.InputMethodManager.HIDE_IMPLICIT_ONLY
사용자가 메뉴를 누른 채로 키보드를 표시하도록 명시적으로 강제하지 않았을 때만 키보드를 숨길 수 있는 두 번째 매개 변수입니다.
참고: 코틀린에서 이 작업을 수행하려면 다음을 사용합니다.context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
코틀린 구문
// Only runs if there is a view that is currently focused
this.currentFocus?.let { view ->
val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager
imm?.hideSoftInputFromWindow(view.windowToken, 0)
}
이 광기를 명확히 하기 위해, 저는 모든 안드로이드 사용자들을 대표하여 구글이 소프트 키보드를 완전히 우스꽝스럽게 취급한 것에 대해 사과하는 것으로 시작하고 싶습니다.동일한 간단한 질문에 대해 각각 다른 많은 답이 있는 이유는 이 API가 Android의 다른 많은 것들과 마찬가지로 끔찍하게 설계되었기 때문입니다.나는 그것을 정중하게 표현할 방법이 없습니다.
키보드를 숨기고 싶습니다.과 같은 문구를 합니다.Keyboard.hide()
◦ 정말 감사합니다.하지만 안드로이드는 문제가 있습니다.다음을 사용해야 합니다.InputMethodManager
키보드를 숨깁니다.좋아요, 이것은 안드로이드의 키보드 API입니다. 하지만!당신은 필요합니다.Context
IMM에 접근하기 위해.이제 문제가 생겼습니다.하지 않거나 필요 수 .Context
더 나쁜에서 무엇을 할 것인지를 입니다.View
(혹은 더 나쁜 것은, 무엇입니까?Window
키보드를 숨기려는 경우
이것이 키보드를 숨기는 것을 매우 어렵게 만드는 이유입니다.:가 케이크 레시피를 때, 케크레시찾없아니습다보니를피이에게▁no▁is없다▁google습니▁there,▁for니찾▁when보아가 없습니다.RecipeProvider
누가 케이크를 먹을 것인지, 어디서 먹을 것인지 내가 먼저 대답하지 않으면 나에게 레시피를 제공하기를 거부할 지구상에서!!
추악한 : , 은 두 신분증을 해야 할 입니다: a 이 슬 이 야 키 드 를 숨 려 기 드 면 두 신 제 합 가 형 야 해 증 을 니 공 분 다 의 태 지 :a.Context
그리고 둘 중 하나.View
는또.Window
.
저는 당신이 그것을 다음과 같이 부른다면, 그 일을 매우 견고하게 할 수 있는 정적 유틸리티 방법을 만들었습니다.Activity
.
public static void hideKeyboard(Activity activity) {
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
//Find the currently focused view, so we can grab the correct window token from it.
View view = activity.getCurrentFocus();
//If no view currently has focus, create a new one, just so we can grab a window token from it
if (view == null) {
view = new View(activity);
}
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
이 유틸리티 메서드는 에서 호출될 때만 작동합니다.Activity
은 위의방호니다출됩이법라고 합니다.getCurrentFocus
Activity
올바른 창 토큰을 가져옵니다.
하지만 키보드를 숨기고 싶다고 가정해 보겠습니다.EditText
에서주는에서 DialogFragment
위의 방법을 사용할 수 없습니다.
hideKeyboard(getActivity()); //won't work
사용자가 다음에 대한 참조를 전달할 것이기 때문에 이 작업은 작동하지 않습니다.Fragment
의인Activity
집중적인 통제가 없는 동안Fragment
가 표시됩니다! 와우! 그래서 키보드를 파편으로부터 숨기기 위해, 저는 더 낮은 수준, 더 일반적이고 추한 것에 의지합니다.
public static void hideKeyboardFrom(Context context, View view) {
InputMethodManager imm = (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
다음은 이 솔루션을 찾는 데 더 많은 시간을 허비하여 수집한 몇 가지 추가 정보입니다.
Windows소프트 정보입력 모드
또 다른 논쟁거리가 있습니다.첫 Android에 초기 포커스를 합니다.EditText
가능한 컨트롤을 합니다.Activity
입력 방법(일반적으로 소프트 키보드)이 포커스 이벤트에 응답하여 자동으로 표시됩니다. 그windowSoftInputMode
을 입력합니다.AndroidManifest.xml
하기로 되어 있을 때stateAlwaysHidden
키보드가 자동으로 표시되는 초기 포커스를 무시하도록 지시합니다.
<activity
android:name=".MyActivity"
android:windowSoftInputMode="stateAlwaysHidden"/>
수 없을 할 때 가 열리는 것을 것은 것도 않는 것처럼 .focusable="false"
및/는focusableInTouchMode="false"
컨트롤에 할당됨).보아하니, 창이 소프트합니다.입력 모드 설정은 자동 포커스 이벤트에만 적용되며 터치 이벤트에 의해 트리거된 포커스 이벤트에는 적용되지 않습니다.
그므로러,stateAlwaysHidden
이름이 정말 형편없군요.라고 불러야 할 것 같습니다.ignoreInitialFocus
대신.
업데이트: 창 토큰을 가져오는 추가 방법
포커스된 보기가 없는 경우(예: 조각을 변경한 경우에만 발생할 수 있음) 유용한 창 토큰을 제공하는 다른 보기가 있습니다.
위 코드에 대한 대안입니다.if (view == null) view = new View(activity);
이것들은 당신의 활동을 명시적으로 언급하지 않습니다.
fragment 클래스 내부:
view = getView().getRootView().getWindowToken();
조각이 주어지면fragment
매개 변수로:
view = fragment.getView().getRootView().getWindowToken();
컨텐츠 본문부터 시작:
view = findViewById(android.R.id.content).getRootView().getWindowToken();
업데이트 2: 백그라운드에서 앱을 열면 키보드가 다시 표시되지 않도록 포커스를 지웁니다.
메서드의 끝에 다음 행을 추가합니다.
view.clearFocus();
소프트 키보드를 숨기는 데도 유용합니다.
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN
);
사용자가 실제로 편집 텍스트 보기를 누를 때까지 소프트키보드를 누르는 데 사용할 수 있습니다.
키보드를 숨길 수 있는 솔루션이 하나 더 있습니다.
InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
기여패스패스.HIDE_IMPLICIT_ONLY
에의 에.showFlag
그리고.0
에의 에.hiddenFlag
소프트 키보드가 강제로 닫힙니다.
마이어의 해결책은 저에게도 효과가 있습니다.제 경우 앱의 최상위 수준은 탭 호스트이며 탭을 전환할 때 키워드를 숨기고 싶습니다. 탭 호스트 보기에서 창 토큰을 가져옵니다.
tabHost.setOnTabChangedListener(new OnTabChangeListener() {
public void onTabChanged(String tabId) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(tabHost.getApplicationWindowToken(), 0);
}
}
는 코래드사보오십에서 사용해 .onCreate()
EditText edtView = (EditText) findViewById(R.id.editTextConvertValue);
edtView.setInputType(InputType.TYPE_NULL);
업데이트: 이 솔루션이 더 이상 작동하지 않는 이유를 모르겠습니다(Android 23에서 방금 테스트했습니다).대신 Saurabh Pareek의 용액을 사용해주세요.여기 있습니다.
InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
//Hide:
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
//Show
imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
이전 답변:
//Show soft-keyboard:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
//hide keyboard :
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
protected void hideSoftKeyboard(EditText input) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(input.getWindowToken(), 0);
}
여기에 나와 있는 다른 모든 대답이 원하는 대로 작동하지 않는 경우 키보드를 수동으로 제어하는 다른 방법이 있습니다.
하여 다음중관기만듭능다니을는리를 .EditText
다음과 같습니다.
public void setEditTextFocus(boolean isFocused) {
searchEditText.setCursorVisible(isFocused);
searchEditText.setFocusable(isFocused);
searchEditText.setFocusableInTouchMode(isFocused);
if (isFocused) {
searchEditText.requestFocus();
}
}
다음 더 포커스(를 확인합니다.EditText
키보드를 열거나 닫습니다.
searchEditText.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (v == searchEditText) {
if (hasFocus) {
// Open keyboard
((InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(searchEditText, InputMethodManager.SHOW_FORCED);
} else {
// Close keyboard
((InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(searchEditText.getWindowToken(), 0);
}
}
}
});
이제 키보드를 수동으로 열고 싶을 때마다 다음과 같이 전화합니다.
setEditTextFocus(true);
종료 통화의 경우:
setEditTextFocus(false);
Saurabh Pareek가 지금까지 가장 좋은 답변을 했습니다.
하지만 올바른 깃발을 사용하는 것이 낫습니다.
/* hide keyboard */
((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
/* show keyboard */
((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);
실제 사용 예
/* click button */
public void onClick(View view) {
/* hide keyboard */
((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
/* start loader to check parameters ... */
}
/* loader finished */
public void onLoadFinished(Loader<Object> loader, Object data) {
/* parameters not valid ... */
/* show keyboard */
((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);
/* parameters valid ... */
}
그렇게 검색한 결과, 여기서 나는 나에게 맞는 답을 찾았습니다.
// Show soft-keyboard:
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
// Hide soft-keyboard:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
단답형
의 신의에서.OnClick
청취자 호출onEditorAction
의 시대의EditText
와 함께IME_ACTION_DONE
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
someEditText.onEditorAction(EditorInfo.IME_ACTION_DONE)
}
});
드릴다운
저는 이 방법이 안드로이드의 디자인 패턴에 더 좋고, 더 단순하고, 더 잘 어울린다고 생각합니다.위의 간단한 예(그리고 일반적으로 대부분의 일반적인 경우)에서 당신은 다음을 가질 것입니다.EditText
포커스가 있고 또한 일반적으로 키보드를 호출하는 것이 일반적입니다(많은 일반적인 시나리오에서 분명히 호출할 수 있습니다).동일한 방식으로, 키보드를 해제하는 것이 되어야 하며, 일반적으로 그것은 다음과 같이 할 수 있습니다.ImeAction
어떻게 하는지 보세요.EditText
와 함께android:imeOptions="actionDone"
동작, 동일한 방법으로 동일한 동작을 수행하려고 합니다.
이 관련 답변을 확인
이렇게 하면 됩니다.
public class KeyBoard {
public static void show(Activity activity){
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY); // show
}
public static void hide(Activity activity){
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0); // hide
}
public static void toggle(Activity activity){
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
if (imm.isActive()){
hide(activity);
} else {
show(activity);
}
}
}
KeyBoard.toggle(activity);
커스텀 키보드를 사용하여 16진수를 입력하고 있어서 IMM 키보드를 표시할 수 없습니다.
v3.2.4_r1에서setSoftInputShownOnFocus(boolean show)
TextView가 포커스를 가질 때 키보드를 표시하지 않거나 날씨를 제어하기 위해 추가되었지만 여전히 숨겨져 있으므로 반사를 사용해야 합니다.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
try {
Method method = TextView.class.getMethod("setSoftInputShownOnFocus", boolean.class);
method.invoke(mEditText, false);
} catch (Exception e) {
// Fallback to the second method
}
}
이전 버전의 경우, 매우 좋은 결과를 얻었습니다(그러나 완벽과는 거리가 멀었습니다).OnGlobalLayoutListener
의 도움으로 추가된ViewTreeObserver
합니다.
@Override
public void onGlobalLayout() {
Configuration config = getResources().getConfiguration();
// Dont allow the default keyboard to show up
if (config.keyboardHidden != Configuration.KEYBOARDHIDDEN_YES) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mRootView.getWindowToken(), 0);
}
}
이 마지막 해결 방법은 키보드를 잠시 동안 표시하고 선택 핸들을 잘못 사용할 수 있습니다.
키보드가 전체 화면으로 들어가면 전역 레이아웃이 호출되지 않습니다.이 문제를 방지하려면 TextView#setImeOptions(int) 또는 TextView XML 선언에서 다음을 사용합니다.
android:imeOptions="actionNone|actionUnspecified|flagNoFullscreen|flagNoExtractUi"
업데이트: 키보드를 표시하지 않고 모든 버전에서 작동하는 대화 상자를 찾았습니다.
getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
번째 추가 첫째종성추가implementation 'androidx.core:core-ktx:1.7.0'
아첨하다, 아첨하다, 아첨하다, 아첨하다
그런 다음 ViewCompat 또는 WindowCompat 클래스에서 InsetController를 가져옵니다.
마지막으로 InsetsController의 Hide() 및 Show() 기능을 사용합니다.
대화 상자에 대한 지원을 추가합니다.Bottom 단에 가능 SheetDialog에서 할 수 .SheetDialog.@론데브.
컨텍스트에서 직접 캐스트하는 대신 활동을 안전하게 얻을 수 있는 방법을 사용합니다.
import android.app.Activity
import android.app.Dialog
import android.content.Context
import android.content.ContextWrapper
import android.view.View
import androidx.core.view.ViewCompat
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import androidx.fragment.app.Fragment
fun View.showKeyboard() = ViewCompat.getWindowInsetsController(this)?.show(WindowInsetsCompat.Type.ime())
fun View.hideKeyboard() = ViewCompat.getWindowInsetsController(this)?.hide(WindowInsetsCompat.Type.ime())
fun Dialog.showKeyboard() = window?.decorView?.showKeyboard()
fun Dialog.hideKeyboard() = window?.decorView?.hideKeyboard()
fun Context.showKeyboard() = getActivity()?.showKeyboard()
fun Context.hideKeyboard() = getActivity()?.hideKeyboard()
fun Fragment.showKeyboard() = activity?.showKeyboard()
fun Fragment.hideKeyboard() = activity?.hideKeyboard()
fun Activity.showKeyboard() = WindowCompat.getInsetsController(window, window.decorView)?.show(WindowInsetsCompat.Type.ime())
fun Activity.hideKeyboard() = WindowCompat.getInsetsController(window, window.decorView)?.hide(WindowInsetsCompat.Type.ime())
fun Context.getActivity(): Activity? {
return when (this) {
is Activity -> this
is ContextWrapper -> this.baseContext.getActivity()
else -> null
}
}
아래의 이전 답변
여기 github에 대한 간단한 프로젝트가 있습니다.
import android.app.Activity
import android.app.Dialog
import android.content.Context
import android.content.ContextWrapper
import android.view.View
import androidx.core.view.ViewCompat
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import androidx.fragment.app.Fragment
fun View.showKeyboard() = ViewCompat.getWindowInsetsController(this)?.show(WindowInsetsCompat.Type.ime())
fun View.hideKeyboard() = ViewCompat.getWindowInsetsController(this)?.hide(WindowInsetsCompat.Type.ime())
fun Dialog.showKeyboard() = window?.decorView?.showKeyboard()
fun Dialog.hideKeyboard() = window?.decorView?.hideKeyboard()
fun Context.showKeyboard() = getActivity()?.showKeyboard()
fun Context.hideKeyboard() = getActivity()?.hideKeyboard()
fun Fragment.showKeyboard() = activity?.showKeyboard()
fun Fragment.hideKeyboard() = activity?.hideKeyboard()
fun Activity.showKeyboard() = WindowCompat.getInsetsController(window, window.decorView)?.show(WindowInsetsCompat.Type.ime())
fun Activity.hideKeyboard() = WindowCompat.getInsetsController(window, window.decorView)?.hide(WindowInsetsCompat.Type.ime())
fun Context.getActivity(): Activity? {
return when (this) {
is Activity -> this
is ContextWrapper -> this.baseContext.getActivity()
else -> null
}
}
public void setKeyboardVisibility(boolean show) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if(show){
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}else{
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),0);
}
}
저는 스레드에 게시된 모든 솔루션을 검토하는 데 이틀 이상을 보냈지만 어떤 식으로든 솔루션이 부족하다는 것을 알게 되었습니다.저의 정확한 요구 사항은 100% 신뢰성으로 화면 키보드를 표시하거나 숨길 수 있는 버튼을 갖는 것입니다.키보드가 숨겨진 상태일 때는 사용자가 어떤 입력 필드를 클릭하든 이 다시 나타나지 않아야 합니다.표시 상태일 때 사용자가 어떤 버튼을 클릭하든 키보드가 사라져서는 안 됩니다.이것은 최신 기기까지 Android 2.2+에서 작동해야 합니다.
내 앱 클린 RPN에서 이 작업 구현을 확인할 수 있습니다.
많은 다른 전화기(프로요 및 진저브레드 장치 포함)에서 제안된 답을 테스트한 후 안드로이드 앱이 안정적으로 다음을 수행할 수 있음이 분명해졌습니다.
- 키보드를 일시적으로 숨깁니다.사용자가 새 텍스트 필드에 초점을 맞출 때 다시 나타납니다.
- 활동이 시작될 때 키보드를 표시하고 해당 키보드가 항상 표시되어야 함을 나타내는 플래그를 활동에 설정합니다.이 플래그는 활동을 초기화할 때만 설정할 수 있습니다.
- 키보드를 표시하거나 사용을 허용하지 않도록 활동을 표시합니다.이 플래그는 활동을 초기화할 때만 설정할 수 있습니다.
저는 키보드를 일시적으로 숨기는 것만으로는 충분하지 않습니다.일부 장치에서는 새 텍스트 필드에 초점을 맞추면 바로 다시 나타납니다.앱에서 한 페이지에 여러 텍스트 필드를 사용하기 때문에 새 텍스트 필드에 초점을 맞추면 숨겨진 키보드가 다시 나타납니다.
유감스럽게도 목록의 항목 2와 3은 활동을 시작할 때만 작업 신뢰성을 제공합니다.활동이 표시되면 키보드를 완전히 숨기거나 표시할 수 없습니다.요령은 사용자가 키보드 전환 버튼을 누를 때 실제로 활동을 다시 시작하는 것입니다.사용자가 키보드 전환 버튼을 누르면 내 앱에서 다음 코드가 실행됩니다.
private void toggleKeyboard(){
if(keypadPager.getVisibility() == View.VISIBLE){
Intent i = new Intent(this, MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
Bundle state = new Bundle();
onSaveInstanceState(state);
state.putBoolean(SHOW_KEYBOARD, true);
i.putExtras(state);
startActivity(i);
}
else{
Intent i = new Intent(this, MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
Bundle state = new Bundle();
onSaveInstanceState(state);
state.putBoolean(SHOW_KEYBOARD, false);
i.putExtras(state);
startActivity(i);
}
}
이렇게 하면 현재 활동의 상태가 번들에 저장된 다음 키보드를 표시할지 숨길지 여부를 나타내는 부울을 통과하여 활동이 시작됩니다.
onCreate 메서드 내에서 다음 코드가 실행됩니다.
if(bundle.getBoolean(SHOW_KEYBOARD)){
((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(newEquationText,0);
getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
else{
getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
}
소프트 키보드가 표시되어야 하는 경우 입력 방법 관리자에 키보드가 표시되고 창에 소프트 입력이 항상 표시되도록 지시됩니다.소프트 키보드를 숨겨야 하는 경우 Windows Manager(윈도우 관리합니다.레이아웃 매개 변수.FLAG_ALT_FOCUSABLE_IM이 설정되어 있습니다.
이 접근 방식은 안드로이드 2.2를 실행하는 4년 된 HTC 전화기부터 4.2.2를 실행하는 넥서스 7에 이르기까지 제가 테스트한 모든 장치에서 안정적으로 작동합니다.이 방법의 유일한 단점은 뒤로 버튼을 조심스럽게 조작해야 한다는 것입니다.내 앱에는 기본적으로 하나의 화면(계산기)만 있으므로 BackPressed()에서 재정의하고 장치 홈 화면으로 돌아갈 수 있습니다.
거의 12년이 지난 지금, 우리는 마침내 Android X Core 1.5+로 이를 수행할 공식적이고 역호환적인 방법을 갖게 되었습니다.
fun View.hideKeyboard() = ViewCompat.getWindowInsetsController(this)
?.hide(WindowInsetsCompat.Type.ime())
또는 특히 Fragment에 대해:
fun Fragment.hideKeyboard() = ViewCompat.getWindowInsetsController(requireView())
?.hide(WindowInsetsCompat.Type.ime())
키보드를 여는 데 사용된 (EditText) 필드에 대한 참조가 없어도 어디서든 소프트 키보드를 닫고 필드에 초점을 맞춘 경우에는 다음을 사용할 수 있습니다(활동에서).
if (getCurrentFocus() != null) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
이 SO 답변 덕분에, 저는 ViewPager의 단편을 스크롤할 때 잘 작동하는 다음과 같은 답변을 얻었습니다.
private void hideKeyboard() {
// Check if no view has focus:
View view = this.getCurrentFocus();
if (view != null) {
InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
private void showKeyboard() {
// Check if no view has focus:
View view = this.getCurrentFocus();
if (view != null) {
InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
}
}
위의 답변은 다른 시나리오에서 사용할 수 있지만 보기 안에 키보드를 숨기고 올바른 컨텍스트를 얻으려면 다음을 수행하십시오.
setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
hideSoftKeyBoardOnTabClicked(v);
}
}
private void hideSoftKeyBoardOnTabClicked(View v) {
if (v != null && context != null) {
InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getApplicationWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
그리고 컨텍스트를 생성자로부터 가져오려면 »
public View/RelativeLayout/so and so (Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.context = context;
init();
}
장치 또는 기능 테스트 중에 소프트 키보드를 닫으려면 테스트에서 "뒤로 단추"를 클릭하여 닫을 수 있습니다.
// Close the soft keyboard from a Test
getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
의 "뒤로 은 "뒤로 버튼"이 따옴표로.onBackPressed()
해당 활동의 경우.키보드만 닫으면 됩니다.
뒤로 단추를 닫는 데 약간의 시간이 걸리므로 보기 등에 대한 후속 클릭은 잠시 일시 중지한 후(1초 정도면 충분함)에야 등록됩니다.
안드로이드용 모노(일명 모노드로이드)에서 수행하는 방법은 다음과 같습니다.
InputMethodManager imm = GetSystemService (Context.InputMethodService) as InputMethodManager;
if (imm != null)
imm.HideSoftInputFromWindow (searchbox.WindowToken , 0);
이것은 나에게 이상한 키보드 동작에 효과가 있었습니다.
private boolean isKeyboardVisible() {
Rect r = new Rect();
//r will be populated with the coordinates of your view that area still visible.
mRootView.getWindowVisibleDisplayFrame(r);
int heightDiff = mRootView.getRootView().getHeight() - (r.bottom - r.top);
return heightDiff > 100; // if more than 100 pixels, its probably a keyboard...
}
protected void showKeyboard() {
if (isKeyboardVisible())
return;
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (getCurrentFocus() == null) {
inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
} else {
View view = getCurrentFocus();
inputMethodManager.showSoftInput(view, InputMethodManager.SHOW_FORCED);
}
}
protected void hideKeyboard() {
if (!isKeyboardVisible())
return;
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
View view = getCurrentFocus();
if (view == null) {
if (inputMethodManager.isAcceptingText())
inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_NOT_ALWAYS, 0);
} else {
if (view instanceof EditText)
((EditText) view).setText(((EditText) view).getText().toString()); // reset edit text bug on some keyboards bug
inputMethodManager.hideSoftInputFromInputMethod(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
간단하고 사용하기 쉬운 방법, 키보드 숨기기(사용자 활동)를 호출하기만 하면 키보드를 숨깁니다.
/**
* This method is used to hide keyboard
* @param activity
*/
public static void hideKeyboardFrom(Activity activity) {
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}
활동에 이 최적화된 코드를 사용하면 됩니다.
if (this.getCurrentFocus() != null) {
InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
android:windowSoftInputMode="stateHidden"
매니페스트 파일에 있습니다.예:
<activity
android:name=".ui.activity.MainActivity"
android:label="@string/mainactivity"
android:windowSoftInputMode="stateHidden"/>
•Kotlin Version
경유로Extension Function
코틀린 확장 기능을 사용하면 소프트 키보드를 쉽게 표시하고 숨길 수 있습니다.
확장함수.kt
import android.app.Activity
import android.view.View
import android.view.inputmethod.InputMethodManager
import android.widget.EditText
import androidx.fragment.app.Fragment
fun Activity.hideKeyboard(): Boolean {
return (getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager)
.hideSoftInputFromWindow((currentFocus ?: View(this)).windowToken, 0)
}
fun Fragment.hideKeyboard(): Boolean {
return (context?.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager)
.hideSoftInputFromWindow((activity?.currentFocus ?: View(context)).windowToken, 0)
}
fun EditText.hideKeyboard(): Boolean {
return (context.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager)
.hideSoftInputFromWindow(windowToken, 0)
}
fun EditText.showKeyboard(): Boolean {
return (context.getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager)
.showSoftInput(this, 0)
}
용도
당신의 제이당에.Activity
또는Fragment
,hideKeyboard()
는 의인스에호출뿐아만수분있액다습니의 만 아니라 할 수 있습니다.EditText
예:
editText.hideKeyboard()
열린 키보드의 경우:
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(edtView, InputMethodManager.SHOW_IMPLICIT);
키보드 닫기/숨기기:
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(edtView.getWindowToken(), 0);
제가 사건을 맡았습니다, 제가 사건을 맡은 곳은EditText
는 도위수있니다습할치에도 할 수 있습니다.AlertDialog
그래서 키보드를 닫을 때 닫아야 합니다.다음 코드는 어디서나 작동하는 것 같습니다.
public static void hideKeyboard( Activity activity ) {
InputMethodManager imm = (InputMethodManager)activity.getSystemService( Context.INPUT_METHOD_SERVICE );
View f = activity.getCurrentFocus();
if( null != f && null != f.getWindowToken() && EditText.class.isAssignableFrom( f.getClass() ) )
imm.hideSoftInputFromWindow( f.getWindowToken(), 0 );
else
activity.getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN );
}
언급URL : https://stackoverflow.com/questions/1109022/how-to-close-hide-the-android-soft-keyboard-programmatically
'programing' 카테고리의 다른 글
Ruby: require vs require_require_require - Ruby < 1.9.2 및 >= 1.9.2에서 실행되는 문제를 해결하기 위한 모범 사례 (0) | 2023.06.02 |
---|---|
온라인에서 안드로이드 소스 코드를 어디서 찾을 수 있습니까? (0) | 2023.06.02 |
IMvcBuilder AddJsonOptions는 어디에서 사용되었습니까?Net Core 3.0? (0) | 2023.06.02 |
Shared Preferences에서 commit()와 apply()의 차이점은 무엇입니까? (0) | 2023.06.02 |
디바이스를 Mac localhost Server에 연결하시겠습니까? (0) | 2023.06.02 |