프로그래밍 방식으로 EditText에서 포커스를 설정하고 키보드를 표시하는 방법


180

다음과 같은 뷰가 포함 된 레이아웃이 있습니다.

<LinearLayout>
<TextView...>
<TextView...>
<ImageView ...>
<EditText...>
<Button...>
</linearLayout>

EditText프로그래밍 방식으로 포커스를 설정 (키보드 표시)하려면 어떻게해야합니까?

나는 이것을 시도했지만 Activity정상적으로 시작할 때만 작동 하지만에서 시작하면 TabHost작동하지 않습니다.

txtSearch.setFocusableInTouchMode(true);
txtSearch.setFocusable(true);
txtSearch.requestFocus();


답변:


352

이 시도:

EditText editText = (EditText) findViewById(R.id.myTextViewId);
editText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);

http://developer.android.com/reference/android/view/View.html#requestFocus ()


이 답변에서 보여 키보드를 강제로 코드 업데이트 : stackoverflow.com/questions/5105354/...
데이비드 리먼

5
내 활동을 정상적으로 시작할 때만 작동하지만 TabHost에서 활동을 시작할 때 작동하지 않습니다.
Houcine

27
작동하지 않습니다. 이것은 나를 위해 작동합니다 InputMethodManager imm = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput (InputMethodManager.SHOW_FORCED, 0);
Günay Gültekin

5
"이것은 형제가되지 않습니다". 경우에 따라 postDelayed ()에서이 코드를 비동기 적으로 호출해야합니다. 사용자가 대화 상자에서 "확인"을 누른 후 키보드를 열어야하는 경우가있었습니다. 그리고 대화가 닫힐 때 초점이 엉망이었습니다. 그래서 postDelayed ()에서 위의 코드를 호출했습니다. 대화가 닫힌 후에 실행되었습니다. 이익.
Danylo Volokh

2
답변에 237 위로 투표하고 "그것은 형제 작동하지 않습니다"에 62 🤔 나는 자신의 의견을 얻기 위해 그것을 테스트하고 완벽하게 작동합니다!)
Daniel

165

사용하다:

editText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);

20
5 가지 이상의 다른 접근법을 시도한 후에, 이것은 ( View서브 클래스에서) 나를 위해 일한 유일한 방법이었습니다
William

13
이 제안으로 인해 필드의 초점이 느슨해 지더라도 키보드가 고정됩니다.
까지

2
예, 그것은 저에게도 효과가 있으며 작동 imm.showSoftInput()하지 않습니다.
Spark.Bao

8
이 방법은 작동하지만 홈 버튼 (하드웨어)으로 응용 프로그램을 종료하면 키보드가 화면에 표시됩니다. 키보드가 홈 화면에서 쓸모없는 멸시를 숨기려면 리턴 버튼 (하드웨어)을 눌러야합니다.
Adrien Horgnies

다른 접근법은 저에게 효과가 없었습니다. 감사합니다.
Iman Akbari

53

이것은 ungalcrys 덕분에 나를 위해 일했습니다.

키보드 표시 :

editText = (EditText)findViewById(R.id.myTextViewId);
editText.requestFocus();
InputMethodManager imm = (InputMethodManager)getSystemService(this.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,InputMethodManager.HIDE_IMPLICIT_ONLY);

키보드 숨기기 :

InputMethodManager imm = (InputMethodManager) getSystemService(this.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);

2
유일한 완전한 솔루션. 감사.
korro 2016 년

41

showSoftInput 나를 위해 전혀 작동하지 않았습니다.

입력 모드를 설정해야한다고 생각했습니다. android:windowSoftInputMode="stateVisible"(매니페스트의 활동 구성 요소)

이 도움을 바랍니다!


5
이것은 활동이 시작되었을 때 키보드를 보여줍니다.
William

1
굉장 :) 많은 답변을 시도했지만 이것으로 만 작동시킬 수 있습니다 :) 정말 감사합니다.
Srikanth

매우 과소 평가
Avinash R

완벽한 답변. "editText.requestFocus ()"에서만 작동합니다. 감사.
AVJ

37
final EditText tb = new EditText(this);
tb.requestFocus();
tb.postDelayed(new Runnable() {
    @Override
    public void run() {
        InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        inputMethodManager.showSoftInput(tb, InputMethodManager.SHOW_IMPLICIT);
    }
}, 1000);

1
onResume ()에 표시하려면이 작업을 수행해야했습니다. 지연이 없으면이 스레드에 설명 된 모든 단일 솔루션을 사용하여 아무 작업도 수행되지 않습니다.
FranticRock

1
거기는. 그것이 내가 찾던 대답이었습니다. 그러나 두 번째 전체 지연이 반드시 필요한 것은 아닙니다. 나는 150 밀리 초를 시도했지만 잘 작동했습니다.
Rubberduck

1
감사! 이것은 0ms ( tb.post({ showKeyboard(tb) })) 에서도 작동합니다 . tb조각보기가 아닌 EditText보기 ( ) 가 필요합니다 .
CoolMind

16

소프트 키보드 표시 및 숨기기를위한 kotlin 확장은 다음과 같습니다.

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

fun View.hideKeyboard() {
  val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
  inputMethodManager.hideSoftInputFromWindow(windowToken, 0)
}

그럼 당신은 이것을 할 수 있습니다 :

editText.showKeyboard()
// OR
editText.hideKeyboard()

이것은 휴식에 비해 더 나은 솔루션입니다
d-feverx

5

Android Jetpack수명주기 인식 구성 요소로 수명주기 처리의 일부인 LifecycleObserver 를 사용하는 것이 좋습니다 .

Fragment / Activity가 나타날 때 키보드를 열고 닫고 싶습니다. 먼저 EditText에 대해 두 가지 확장 함수 를 정의 하십시오. 프로젝트의 어느 곳에 나 배치 할 수 있습니다.

fun EditText.showKeyboard() {
    requestFocus()
    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)
}

그런 다음 열고 키보드 활동 / 조각에 도달 닫는 LifecycleObserver 정의 onResume()또는 onPause:

class EditTextKeyboardLifecycleObserver(private val editText: WeakReference<EditText>) :
    LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun openKeyboard() {
        editText.get()?.postDelayed({ editText.get()?.showKeyboard() }, 100)
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    fun closeKeyboard() {
        editText.get()?.hideKeyboard()
    }
}

그런 다음 Fragments / Activities에 다음 줄을 추가하면 언제든지 LifecycleObserver를 재사용 할 수 있습니다. 예 : 조각의 경우 :

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

    // inflate the Fragment layout

    lifecycle.addObserver(EditTextKeyboardLifecycleObserver(WeakReference(myEditText)))

    // do other stuff and return the view

}

4

키보드를 숨기고 표시하는 KeyboardHelper 클래스는 다음과 같습니다.

import android.content.Context;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;

/**
 * Created by khanhamza on 06-Mar-17.
 */

public class KeyboardHelper {
public static void hideSoftKeyboard(final Context context, final View view) {
    if (context == null) {
        return;
    }
    view.requestFocus();
    view.postDelayed(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
assert imm != null;
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}, 1000);
}

public static void hideSoftKeyboard(final Context context, final EditText editText) {
    editText.requestFocus();
    editText.postDelayed(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
assert imm != null;
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
}
}, 1000);
}


public static void openSoftKeyboard(final Context context, final EditText editText) {
    editText.requestFocus();
    editText.postDelayed(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
assert imm != null;
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
}
}, 1000);
}
}

0

첫 번째 방법 :

    etPassword.post(() -> {
        etPassword.requestFocus();
        InputMethodManager manager = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        manager.showSoftInput(etPassword, InputMethodManager.SHOW_IMPLICIT);
    });

두 번째 방법 :

매니페스트에서 :

    <activity
        android:name=".activities.LoginActivity"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="stateVisible"/>

코드에서 :

etPassword.requestFocus();

0

나는 많은 방법을 시도했지만 제대로 작동하지 않습니다. 조각에서 편집 텍스트가 포함 된 활동으로 공유 전환을 사용하고 있기 때문에 확실하지 않습니다.

내 편집 텍스트는 LinearLayout으로 래핑됩니다.

포커스를 요청하기 위해 약간의 지연이 추가되었으며 아래 코드가 나를 위해 일했습니다. (Kotlin)

 et_search.postDelayed({
     editText.requestFocus()

     showKeyboard()
 },400) //only 400 is working fine, even 300 / 350, the cursor is not showing

showKeyboard ()

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

0
editTxt.setOnFocusChangeListener { v, hasFocus ->
            val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            if (hasFocus) {
                imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY)
            } else {
                imm.hideSoftInputFromWindow(v.windowToken, 0)
            }
        }

-1

이 답변 중 어느 것도 스스로 작동하지 못했습니다. 나를위한 해결책은 그것들을 결합하는 것이 었습니다.

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
editText.requestFocus();
imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);

왜 그것이 저에게 필요한지 잘 모르겠습니다. 문서에 따르면 두 방법 모두 자체적으로 작동해야합니다.


이것은 좋은 습관이 아닙니다. 액티비티 또는 프래그먼트 트랜잭션이 소프트 키보드와 관련이 있거나 입력 방법 플래그가 올바르게 설정되지 않았지만 어느 쪽이든이 솔루션을 사용해서는 안됩니다.
Marcel Bro
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.