편집 텍스트에 초점을 맞출 때 소프트 키보드를 표시하는 방법
EditText
초점이 맞았을 때 (기기에 물리적 키보드가없는 경우) 소프트 키보드를 자동으로 표시 하고 싶은데 두 가지 문제가 있습니다.
내가
Activity
표시되면EditText
초점이 맞았지만 키보드가 표시되지 않는 경우 키보드를 다시 표시하려면 키보드를 다시 클릭해야합니다 (내가 표시되면 표시되어야 함Activity
).키보드에서 완료를 클릭하면 키보드가 닫히지 만
EditText
초점 이 유지되고 원하지 않습니다 (편집이 완료되었으므로).
다시 시작하기 위해 내 문제는 iPhone과 같은 것을 얻는 것입니다. 키보드는 내 EditText
상태 (초점 / 초점이 맞지 않음)와 동기화 상태 를 유지하고 물리적 키보드가 있으면 소프트 키보드를 표시하지 않습니다.
소프트 키보드를 강제로 표시하려면
EditText yourEditText= (EditText) findViewById(R.id.yourEditText);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT);
에 대한 초점을 제거하려면 EditText
슬프게도 View
초점을 잡을 더미가 필요합니다 .
이게 도움이 되길 바란다
그것을 닫으려면 사용할 수 있습니다
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(yourEditText.getWindowToken(), 0);
이것은 대화 상자에서 사용하기 위해 작동합니다
public void showKeyboard(){
InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}
public void closeKeyboard(){
InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
}
나는 같은 문제가 있었다. editText VISIBILITY가 GONE에서 VISIBLE로 변경 되 자마자 포커스를 설정하고 소프트 키보드를 표시해야했습니다. 다음 코드를 사용하여 이것을 달성했습니다.
new Handler().postDelayed(new Runnable() {
public void run() {
// ((EditText) findViewById(R.id.et_find)).requestFocus();
//
EditText yourEditText= (EditText) findViewById(R.id.et_find);
// InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
// imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT);
yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));
}
}, 200);
100ms 지연으로 작동하지만 지연없이 또는 1ms 지연으로 실패했습니다.
주석 처리 된 코드 부분은 일부 장치에서만 작동하는 다른 접근 방식을 보여줍니다. OS 버전 2.2 (에뮬레이터), 2.2.1 (실제 장치) 및 1.6 (에뮬레이터)에서 테스트했습니다.
이 접근 방식은 나에게 많은 고통을 덜어 주었다.
키보드가 나타나게하려면
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
이 메소드는 InputMethodManager를 직접 호출하는 것보다 더 안정적입니다.
닫으려면
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
아무것도 작동하지 않으면 강제로 표시하십시오 .
editText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
다음 코드는 Google 4.1의 SearchView 소스 코드에서 추출 된 것입니다. 더 적은 버전의 Android에서도 잘 작동하는 것 같습니다.
private Runnable mShowImeRunnable = new Runnable() {
public void run() {
InputMethodManager imm = (InputMethodManager) getContext()
.getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
imm.showSoftInput(editText, 0);
}
}
};
private void setImeVisibility(final boolean visible) {
if (visible) {
post(mShowImeRunnable);
} else {
removeCallbacks(mShowImeRunnable);
InputMethodManager imm = (InputMethodManager) getContext()
.getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
imm.hideSoftInputFromWindow(getWindowToken(), 0);
}
}
}
또한 제어 / 활동이 생성 될 때 다음 코드를 추가해야합니다. (제 경우에는 활동이 아닌 복합 컨트롤입니다).
this.editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
public void onFocusChange(View v, boolean hasFocus) {
setImeVisibility(hasFocus);
}
});
android:windowSoftInputMode="stateAlwaysVisible"
매니페스트 파일에서->
edittext.requestFocus();
코드에서->.
활동이 나타날 때 편집 텍스트에 포커스를 요청하는 소프트 키보드가 열립니다.
아래 코드를 사용하여 간단한 경우에 최근 운이 좋았습니다. 모든 테스트를 완료하지는 못했지만 ...
EditText input = (EditText) findViewById(R.id.Input);
input.requestFocus();
input.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
input.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));
키보드가 표시됩니다.
소프트 키보드를 강제로 표시하려고 시도하면 작동합니다.
...
dialog.show();
input.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
때로는 raukodraug의 답변이 작동하지 않습니다. 몇 가지 시행 착오로 이런 식으로 만들었습니다.
public static void showKeyboard(Activity activity) {
if (activity != null) {
activity.getWindow()
.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
}
public static void hideKeyboard(Activity activity) {
if (activity != null) {
activity.getWindow()
.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
}
}
그리고 EditText 부분 :
editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
hideKeyboard(getActivity());
} else {
showKeyboard(getActivity());
}
}
});
키보드를 숨기려면 다음 중 하나를 사용하십시오.
getActivity().getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
키보드를 표시하려면
getActivity().getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
showSoftInput
나를 위해 전혀 작동하지 않았습니다.
입력 모드를 설정해야한다고 생각했습니다. (매니페스트의 Activity 구성 요소)
android:windowSoftInputMode="stateVisible"
조각의 경우 작동하는지 확인하십시오.
displayName = (EditText) view.findViewById(R.id.displayName);
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
액티비티 애니메이션이 소프트 키보드를 비활성화 할 수 있음을 발견했을 때 소프트 키보드에 대한 내 문제를 믿거 나 말거나 해결했습니다. 당신이 의도를 호출하면
i.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
과
overridePendingTransition(0, 0);
소프트 키보드를 숨길 수 있으며 표시 할 방법이 없습니다.
나는 다양한 상황에서 같은 문제가 있었고, 내가 찾은 솔루션은 일부에서는 작동하지만 다른 곳에서는 작동하지 않으므로 찾은 대부분의 상황에서 작동하는 결합 솔루션이 있습니다.
public static void showVirtualKeyboard(Context context, final View view) {
if (context != null) {
final InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
view.clearFocus();
if(view.isShown()) {
imm.showSoftInput(view, 0);
view.requestFocus();
} else {
view.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
@Override
public void onViewAttachedToWindow(View v) {
view.post(new Runnable() {
@Override
public void run() {
view.requestFocus();
imm.showSoftInput(view, 0);
}
});
view.removeOnAttachStateChangeListener(this);
}
@Override
public void onViewDetachedFromWindow(View v) {
view.removeOnAttachStateChangeListener(this);
}
});
}
}
}
editText.post(new Runnable() {
@Override
public void run() {
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
}
});
나는 여기에 모든 것을 결합했고 나를 위해 작동합니다.
public static void showKeyboardWithFocus(View v, Activity a) {
try {
v.requestFocus();
InputMethodManager imm = (InputMethodManager) a.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT);
a.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
} catch (Exception e) {
e.printStackTrace();
}
}
Kotlin의 경우 다음 확장을 사용하십시오.
fun EditText.showKeyboard() {
val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}
fun EditText.hideKeyboard() {
val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(this.windowToken, 0)
}
코드 스 니펫. . .
public void hideKeyboard(Context activityContext){
InputMethodManager imm = (InputMethodManager)
activityContext.getSystemService(Context.INPUT_METHOD_SERVICE);
//android.R.id.content ( http://stackoverflow.com/a/12887919/2077479 )
View rootView = ((Activity) activityContext)
.findViewById(android.R.id.content).getRootView();
imm.hideSoftInputFromWindow(rootView.getWindowToken(), 0);
}
public void showKeyboard(Context activityContext, final EditText editText){
final InputMethodManager imm = (InputMethodManager)
activityContext.getSystemService(Context.INPUT_METHOD_SERVICE);
if (!editText.hasFocus()) {
editText.requestFocus();
}
editText.post(new Runnable() {
@Override
public void run() {
imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);
}
});
}
그것은 나를 위해 일했다. 키보드를 표시하기 위해 이것을 시도해 볼 수도 있습니다.
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
매니페스트 파일에 android : windowSoftInputMode = "stateHidden"을 추가하십시오 ...
final InputMethodManager keyboard = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
매니페스트 내부 :
android:windowSoftInputMode="stateAlwaysVisible"
-처음에 키보드를 시작했습니다. android:windowSoftInputMode="stateAlwaysHidden"
-처음에는 숨겨진 키보드.
"adjustPan"
키보드가 시작되면 화면이 자동으로 조정되기 때문에 사용하고 싶습니다 .
<activity
android:name="YourActivity"
android:windowSoftInputMode="stateAlwaysHidden|adjustPan"/>
위에 주어진 모든 솔루션 ( EditText에 첨부 된 OnFocusChangeListener.onFocusChange 리스너의 InputMethodManager 상호 작용 은 활동에서 단일 편집이 있으면 잘 작동합니다.
제 경우에는 두 가지 편집이 있습니다.
private EditText tvX, tvY;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
tvX.setOnFocusChangeListener(this);
tvY.setOnFocusChangeListener(this);
@Override
public void onFocusChange(View v, boolean hasFocus) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if(tvX.hasFocus() || tvY.hasFocus()) {
imm.showSoftInput(v, 0);
} else {
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
};
onFocusChange가 hasFocus = true (키보드 표시)가있는 tvX에 대해 트리거 된 다음 hasFocus = true (키보드 숨김)가있는 tvY에 대해 트리거되는 것으로 나타났습니다. 결국 키보드가 보이지 않았습니다.
"EditText 텍스트에 포커스가있는 경우 키보드 표시"인 경우 일반 솔루션에 올바른 명령문이 있어야합니다.
활동의 onResume () 섹션에서 bringKeyboard () 메소드를 호출 할 수 있습니다.
onResume() {
EditText yourEditText= (EditText) findViewById(R.id.yourEditText);
bringKeyboard(yourEditText);
}
protected boolean bringKeyboard(EditText view) {
if (view == null) {
return false;
}
try {
// Depending if edittext has some pre-filled values you can decide whether to bring up soft keyboard or not
String value = view.getText().toString();
if (value == null) {
InputMethodManager imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
return true;
}
} catch (Exception e) {
Log.e(TAG, "decideFocus. Exception", e);
}
return false;
}
내 앱 중 하나에서 소프트 키보드가 자동으로 활동을 입력 할 때 (onCreate에 editText.requestFocus ()가 있음) 이상한 동작을 발견했습니다.
더 자세히 살펴보면 레이아웃 주위에 ScrollView가 있기 때문이라는 것을 알았습니다. ScrollView를 제거하면 원래 문제 설명에 설명 된대로 동작이 나타납니다. 이미 포커스가있는 editText를 클릭 할 때만 소프트 키보드가 나타납니다.
그것이 효과가 없다면 ScrollView를 넣어보십시오. 어쨌든 무해합니다.
나는 한 보기 애니메이션을 사용하여 비슷한 문제 . 따라서 표시된 편집 텍스트에서 키보드 액세스를 요청하기 전에 애니메이션이 끝날 때까지 기다릴 수 있도록 애니메이션 리스너를 배치했습니다.
bottomUp.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
if (textToFocus != null) {
// Position cursor at the end of the text
textToFocus.setSelection(textToFocus.getText().length());
// Show keyboard
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(textToFocus, InputMethodManager.SHOW_IMPLICIT);
}
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
나는 raukodraug에 동의하며 swithview에서 다음과 같이 초점을 요청 / 취소해야합니다.
final ViewSwitcher viewSwitcher = (ViewSwitcher) findViewById(R.id.viewSwitcher);
final View btn = viewSwitcher.findViewById(R.id.address_btn);
final View title = viewSwitcher.findViewById(R.id.address_value);
title.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
viewSwitcher.showPrevious();
btn.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(btn, InputMethodManager.SHOW_IMPLICIT);
}
});
// EditText affiche le titre evenement click
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
btn.clearFocus();
viewSwitcher.showNext();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(btn.getWindowToken(), 0);
// Enregistre l'adresse.
addAddress(view);
}
});
문안 인사.
EditText가 Recycler 또는 ListView 내에 있고 / 또는 이것이 비활성화 상태 인 경우 아래 코드를 사용하십시오.
public static void showKeyboardByFocus(final View view)
{
view.requestFocus();
InputMethodManager keyboard = SystemMaster.getInputMethodManager();
keyboard.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
Runnable re = new Runnable()
{
@Override
public void run()
{
view.setEnabled(true);
view.requestFocus();
}
};
Handler h = new Handler(Looper.getMainLooper());
h.postDelayed(re, 360);
}
EditText보기에이 줄을 추가하면됩니다.
android:isScrollContainer="true"
그리고 TADA-키보드가 자동으로 나타나기 시작했습니다!
비슷한 문제가 있었고이 간단하고 이상한 해결책을 발견했습니다.
user3392439에 의해 이미 언급했듯이, 포커스에 따른 키보드의 모양은 XML 파일의 스크롤 구성 요소의 존재와 어렴풋이 연결되어 있습니다.
심지어 존재 다른 같은 XML에 언급 된 라인을 포함 글고보기는 키보드 EditTexts 중 하나가 현재 집중 상관없이 나타날 수 있습니다.
XML 파일에 스크롤 구성 요소를 포함하는 하나 이상의 가시적 뷰 가있는 경우 키보드가 초점에 자동으로 나타납니다.
스크롤이 없으면 키보드가 나타나도록 EditText를 클릭해야합니다.
Xamarin을 사용하면 조각 내에서 작동합니다.
using Android.Views.InputMethods;
using Android.Content;
...
if ( _txtSearch.RequestFocus() ) {
var inputManager = (InputMethodManager) Activity.GetSystemService( Context.InputMethodService );
inputManager.ShowSoftInput( _txtSearch, ShowFlags.Implicit );
}
참고 URL : https://stackoverflow.com/questions/5105354/how-to-show-soft-keyboard-when-edittext-is-focused
'Programming' 카테고리의 다른 글
파이썬에서 여러 분리 문자로 문자열 분리하기 (0) | 2020.02.19 |
---|---|
Mac에서 Android Studio를 완전히 제거하는 방법은 무엇입니까? (0) | 2020.02.19 |
Java에서 난수 얻기 (0) | 2020.02.19 |
목록의 평균 찾기 (0) | 2020.02.19 |
반사판에 대한 오픈 소스 대안? (0) | 2020.02.19 |