나는이 EditText
와 Button
내 레이아웃을.
편집 필드에 쓰고를 클릭하면 Button
가상 키보드를 숨기고 싶습니다. 나는 이것이 간단한 코드 조각이라고 가정하지만 그 예제는 어디에서 찾을 수 있습니까?
키보드 외부를 만질 때.
나는이 EditText
와 Button
내 레이아웃을.
편집 필드에 쓰고를 클릭하면 Button
가상 키보드를 숨기고 싶습니다. 나는 이것이 간단한 코드 조각이라고 가정하지만 그 예제는 어디에서 찾을 수 있습니까?
키보드 외부를 만질 때.
답변:
이 광기를 명확히하기 위해 모든 안드로이드 사용자를 대신하여 Google의 소프트 키보드에 대한 우스꽝스러운 대우에 대해 사과하고 싶습니다. 동일한 간단한 질문에 대해 서로 다른 많은 답변이있는 이유는 안드로이드의 다른 많은 사람들과 마찬가지로이 API는 끔찍하게 설계 되었기 때문입니다. 나는 그것을 정중하게 표현할 방법이 없다고 생각할 수 있습니다.
키보드를 숨기고 싶습니다. Android에 다음 진술을 제공 할 것으로 예상됩니다 Keyboard.hide()
. 끝. 대단히 감사합니다. 그러나 안드로이드에 문제가 있습니다. InputMethodManager
키보드를 숨기려면를 사용해야합니다 . 자, 이것은 키보드에 대한 안드로이드의 API입니다. 그러나! Context
IMM에 액세스 하려면을 가지고 있어야합니다 . 이제 문제가 있습니다. 사용하지 않거나 필요로하는 정적 또는 유틸리티 클래스에서 키보드를 숨기고 싶을 수도 있습니다 Context
. 나 그리고 훨씬 더의 IMM은 당신이 무엇을 지정해야합니다 View
(또는 더 나쁜, 무엇을 Window
) 당신이에서 키보드를 숨길.
이것이 키보드를 숨기는 것이 어려운 일입니다. 친애하는 Google : 케이크를 만들기위한 레시피를 찾을 때, RecipeProvider
누가 WHO에게 케이크를 먹을 것인지 그리고 어디서 먹을지를 대답하지 않으면 레시피를 제공하지 않을 지구상 이 없습니다 !!
이 슬픈 이야기는 추악한 진실로 끝납니다 .Android 키보드를 숨기려면 a Context
와 a View
또는 a의 두 가지 형태의 식별을 제공해야 합니다 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);
}
아래는이 솔루션을 쫓는 데 더 많은 시간을 투자하여 얻은 추가 정보입니다.
windowSoftInputMode 정보
알아야 할 또 다른 논쟁 지점이 있습니다. 기본적으로 Android는의 첫 번째 EditText
또는 포커스 가능한 컨트롤에 초기 포커스를 자동으로 할당 합니다 Activity
. InputMethod (일반적으로 소프트 키보드)는 자체적으로 초점 이벤트에 응답합니다. 의 windowSoftInputMode
속성이로 AndroidManifest.xml
설정 stateAlwaysHidden
되면 키보드가 자동으로 할당 된이 초기 포커스를 무시하도록 지시합니다.
<activity
android:name=".MyActivity"
android:windowSoftInputMode="stateAlwaysHidden"/>
거의 믿을 수 없을 정도로, 컨트롤을 만질 때 키보드가 열리지 않도록 아무것도하지 않는 것처럼 보입니다 ( focusable="false"
및 / 또는focusableInTouchMode="false"
제어에 할당됩니다). 분명히 windowSoftInputMode 설정은 터치 이벤트에 의해 트리거 된 이벤트에 초점을 맞추지 않고 자동 포커스 이벤트에만 적용됩니다.
따라서 stateAlwaysHidden
이름이 매우 잘못되었습니다. 아마도 전화해야합니다ignoreInitialFocus
대신 합니다.
도움이 되었기를 바랍니다.
업데이트 : 창 토큰을 얻는 더 많은 방법
집중된 뷰가없는 경우 (예 : 방금 조각을 변경 한 경우 발생할 수 있음) 유용한 창 토큰을 제공하는 다른 뷰가 있습니다.
위 코드에 대한 대안입니다 if (view == null) view = new View(activity);
. 귀하의 활동을 명시 적으로 언급하지는 않습니다.
프래그먼트 클래스 내부 :
view = getView().getRootView().getWindowToken();
조각 fragment
으로 매개 변수가 주어지면 :
view = fragment.getView().getRootView().getWindowToken();
컨텐츠 본문에서 시작 :
view = findViewById(android.R.id.content).getRootView().getWindowToken();
업데이트 2 : 백그라운드에서 앱을 열면 키보드가 다시 표시되지 않도록 포커스를 지우십시오.
메소드 끝에 다음 행을 추가하십시오.
view.clearFocus();
Fragment
그것은 당신이 사용할 수 있는 것 같습니다getActivity().getWindow().getDecorView()
Keyboard.hide();
유틸리티를 제공해야한다
InputMethodManager를 사용하여 Android가 가상 키보드를 숨기도록 강제 할 수 있습니다 .를 호출 hideSoftInputFromWindow
하면 포커스 된 뷰가 포함 된 창의 토큰이 전달됩니다.
// 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
경우에 따라 사용자가 키보드를 명시 적으로 표시하지 않은 경우 (메뉴를 누르고 있음) 키보드를 숨기도록 두 번째 매개 변수로 수 있습니다.
참고 : Kotlin에서이 작업을 수행하려면 다음을 사용하십시오.
context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
코 틀린 구문
// Check if no view has focus:
val view = this.currentFocus
view?.let { v ->
val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager
imm?.hideSoftInputFromWindow(v.windowToken, 0)
}
editText.clearFocus()
후 InputMethodManager.HIDE_IMPLICIT_ONLY
도 것은에서 작동4.1
View focused = getCurrentFocus()
것입니다 것을 얻을 확실히 호출, 현재 포커스보기 focused.clearFocus()
다음과 inputMethodManager.hideSoftInputFromWindow(focused.getWindowToken(), 0)
(일반 플래그).
소프트 키보드를 숨길 때도 유용합니다.
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN
);
사용자가 editText보기를 실제로 터치 할 때까지 소프트 키보드를 억제하는 데 사용할 수 있습니다.
키보드를 숨기는 솔루션이 하나 더 있습니다.
InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
여기서 전달 HIDE_IMPLICIT_ONLY
의 위치 showFlag
와 0
의 위치 hiddenFlag
. 소프트 키보드가 강제로 닫힙니다.
Meier의 솔루션도 저에게 효과적입니다. 필자의 경우 내 앱의 최상위 레벨은 tabHost이며 탭을 전환 할 때 키워드를 숨기고 싶습니다-tabHost보기에서 창 토큰을 얻습니다.
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(0);
editView.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);
I don't know why this solution is not work any more
- 안드로이드 이기 때문에 모든 것이 바뀔 수 있습니다. 디자인이 잘못 되었을 수도 있습니다.
protected void hideSoftKeyboard(EditText input) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(input.getWindowToken(), 0);
}
input.getContext().getSystemService(Context.INPUT_METHOD_SERVICE)
.
input.setInputType(0);
이 코드에서 제거 했습니다. 그것은 키보드의 행동과 변화 inputType
위해를 EditText
.
여기에있는 다른 모든 답변이 원하는대로 작동하지 않으면 키보드를 수동으로 제어하는 또 다른 방법이 있습니다.
EditText
의 속성 중 일부를 관리하는 함수를 만듭니다 .
public void setEditTextFocus(boolean isFocused) {
searchEditText.setCursorVisible(isFocused);
searchEditText.setFocusable(isFocused);
searchEditText.setFocusableInTouchMode(isFocused);
if (isFocused) {
searchEditText.requestFocus();
}
}
그런 다음 onFocus가 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);
사우 라브 파릭 가 지금까지 가장 좋은 답변을 .
그래도 올바른 플래그를 사용할 수 있습니다.
/* 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 ... */
}
fragment.getActivity().getSystemService();
그래서 검색에서 나에게 맞는 답변을 찾았습니다.
// 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)
}
});
이 방법이 더 좋고 간단하며 Android의 디자인 패턴과 더 잘 어울린다고 생각합니다. 위의 간단한 예에서 (보통 대부분의 경우) EditText
초점이 있고 일반적으로 키보드를 처음에 호출하는 것이 었습니다 (많은 사람들이 키보드를 호출 할 수 있음) 일반적인 시나리오). 같은 방법으로, 이 키보드를 분리 할 수있는 것이어야한다, 보통 있다는하여 수행 할 수 있습니다 ImeAction
. EditText
with의 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);
hide()
및 show()
이하지 않을 때 표시하고시기를보다 효율적으로 제어 할 방법을. :) 나는 예를 편집합니다 나를 위해 작품, 나도 그것을 않았다
KeyBoard.toggle(fragment.getActivity())
Fragment
주석 처리 된 것처럼 메소드를 다르게 호출하십시오 . 방법을 사용하는 방법을 배우고 다시 오십시오. 당신은 당신의 어리석은 대답과 사람들을 혼동합니다
IMM 키보드를 표시 할 수 없도록 사용자 정의 키보드를 사용하여 16 진수를 입력하고 있습니다 ...
v3.2.4에서는 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);
}
}
이 마지막 솔루션은 순간적으로 키보드를 표시하고 선택 핸들을 망칠 수 있습니다.
키보드가 전체 화면으로 들어가면 onGlobalLayout이 호출되지 않습니다. 이를 피하려면 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);
스레드에 게시 된 모든 솔루션을 작업하는 데 이틀 이상을 보냈으며 어떤 방식 으로든 부족한 것으로 나타났습니다. 정확한 요구 사항은 100 % 안정성을 갖춘 버튼을 사용하여 온 스크린 키보드를 표시하거나 숨기는 것입니다. 키보드가 숨겨진 상태 인 경우 사용자가 클릭 한 입력 필드에 관계없이 다시 나타나지 않아야합니다. 키보드가 보이는 상태에서 사용자가 어떤 버튼을 클릭하더라도 키보드가 사라지지 않아야합니다. 최신 기기까지 Android 2.2 이상에서 작동해야합니다.
내 앱 clean RPN 에서 작동하는 구현을 볼 수 있습니다 .
많은 다른 전화 (froyo 및 gingerbread 장치 포함)에서 제안 된 답변을 테스트 한 후 Android 앱이 안정적으로 다음을 수행 할 수 있음이 분명해졌습니다.
나를 위해 키보드를 일시적으로 숨기는 것만으로는 충분하지 않습니다. 일부 장치에서는 새 텍스트 필드에 초점을 맞추 자마자 다시 나타납니다. 내 앱이 한 페이지에서 여러 텍스트 필드를 사용하므로 새 텍스트 필드에 초점을 맞추면 숨겨진 키보드가 다시 팝업됩니다.
불행히도 목록의 항목 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);
}
소프트 키보드가 표시되면 InputMethodManager에 키보드를 표시하라는 메시지가 표시되고 소프트 입력이 항상 표시되도록 창에 지시됩니다. 소프트 키보드를 숨기려면 WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM이 설정됩니다.
이 방법은 안드로이드 2.2를 실행하는 4 년 된 HTC 전화에서 4.2.2를 실행하는 넥서스 7까지 내가 테스트 한 모든 장치에서 안정적으로 작동합니다. 이 방법의 유일한 단점은 뒤로 단추를 처리 할 때주의해야한다는 것입니다. 내 응용 프로그램에는 기본적으로 하나의 화면 (계산기) 만 있으므로 onBackPressed ()를 재정의하고 장치 홈 화면으로 돌아갈 수 있습니다.
이 모든 주위 해결책 대신 키보드 를 여는 데 사용 된 (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 초가 충분합니다. ).
이것은 모든 기괴한 키보드 동작에 대해 나를 위해 일했습니다.
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);
}
}
android:windowSoftInputMode="stateHidden"
매니페스트 파일에서 활동 에 추가 하십시오. 예:
<activity
android:name=".ui.activity.MainActivity"
android:label="@string/mainactivity"
android:windowSoftInputMode="stateHidden"/>
간단하고 사용하기 쉬운 메소드, hideKeyboardFrom (YourActivity.this); 키보드를 숨기려면
/**
* 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);
}
public static void hideSoftKeyboard(Activity activity) {
InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}
onTouchListener에 대한 호출 후 :
findViewById(android.R.id.content).setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Utils.hideSoftKeyboard(activity);
return false;
}
});
이것을 사용하십시오
this.getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
필자의 경우 작업 표시 줄에서 SearchView를 사용하고있었습니다. 사용자가 검색을 수행하면 키보드가 다시 열립니다.
InputMethodManager를 사용해도 키보드가 닫히지 않았습니다. 초점을 지우고 검색 뷰의 포커스를 false로 설정해야했습니다.
mSearchView.clearFocus();
mSearchView.setFocusable(false);
clearFocus()
Android API 페이지가 없으므로 작동하지 않지만 다른 해결책이 있습니다 (아래 답변 참조).
케이스에 위치 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 );
}
나는이 답변을 거의 모두 시도했지만 특히 삼성 갤럭시 s5와 관련하여 임의의 문제가있었습니다.
내가 끝내는 것은 쇼를 숨기고 완벽하게 작동하는 것입니다.
/**
* Force show softKeyboard.
*/
public static void forceShow(@NonNull Context context) {
InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}
/**
* Force hide softKeyboard.
*/
public static void forceHide(@NonNull Activity activity, @NonNull EditText editText) {
if (activity.getCurrentFocus() == null || !(activity.getCurrentFocus() instanceof EditText)) {
editText.requestFocus();
}
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
}