프로그래밍 방식으로 소프트 키보드 열기


116

하위 위젯이없는 활동이 있으며 해당 xml 파일은 다음과 같습니다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/myLayout"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:focusable="true"
>
</LinearLayout>

활동이 시작되는 동안 프로그래밍 방식으로 소프트 키보드를 열고 싶습니다. 지금까지 시도한 것은

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if (inputMethodManager != null) {
        inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    }

지침을 좀주세요.


안녕 vignesh하지만 textView없이 소프트 키보드를 열 필요는 무엇입니까?
milind

사실 저는 그 활동에서 키 리스너를 사용하려고하는데 그렇게해야합니다.
Vignesh 2011

당신이 한 일은 정확합니다. 키보드가 보이지 않는 이유를 모르겠습니다. 이 코드를 한 번 사용하여 editText에 대한 사용자 작업없이 키보드를 시작했는데 성공했습니다.
Vinoth 2011

안녕하세요 Vinoth, DSouza 게시물과 똑같이 코드를 변경했으며 내 질문도 업데이트 했으므로 변경해야 할 사항이 있는지 확인하십시오.
Vignesh 2011

답변:


145

다음 줄을 사용하여 onclick 이벤트 내에서 소프트 키보드를 수동으로 표시했으며 키보드가 표시됩니다.

InputMethodManager inputMethodManager =
    (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInputFromWindow(
    linearLayout.getApplicationWindowToken(),
    InputMethodManager.SHOW_FORCED, 0);

그러나 활동이 열리는 동안 여전히 이것을 열 수 없으므로 이에 대한 해결책이 있습니까?


@YosiTaguri, 활동을 다루는 경우 훨씬 더 우아합니다. 그리고 조각은 어떻습니까?! 두 답변 모두 +1
S.Thiongane 2014

텍스트를 편집하는 대화 상자에서 키보드를 열어야한다면 어떻게해야합니까? 그렇게하는 방법?
seema

5
@Vignesh : 활동을 시작할 때이 코드를 구현하려면 키보드를 여는 동안 500 밀리 초와 같은 지연을 제공해야합니다.
Vinit Saxena

@vinitsaxena는 여러분의 소중한 의견에 감사드립니다
인 Vignesh

잘 모르겠지만 예를 들어 TextView에 대한보기를 얻고 다음과 같은 리스너를 추가하려고했습니다. myTextView.post (new Runnable () {public void run () {// here your method}}); 이 뷰는 눈에 보이는 모든 화면이 지금 당신은 당신이 원하는대로 호출 할 수 있음을 의미 만들 때
알렉세이 Timoshchenko

121

매니페스트 파일 <activity>에서 활동이 시작될 때 키보드를 표시하려는에 다음을 추가해보세요 .

android:windowSoftInputMode="stateVisible"

이렇게하면 활동이 시작될 때 키보드가 표시됩니다.

더 많은 옵션을 보려면 문서를 확인하세요 .


3
페이지 하단에 모든 더러운 해킹을 가져 오기 위해이 답변에 대해 더 자주 upvote 할 수 있기를 바랍니다.)
fjdumont

프로그래밍 방식으로 어떻게 수행합니까? 특정 상황에서만 키보드가 자동으로 표시되기를 원합니다.
phreakhead 2013 년

1
이 링크 링크 와 같은 입력 대화 상자가 있는데 키보드를 활동이 아닌 프롬프트에 표시하는 방법은 무엇입니까? 이것은 <code> InputMethodManager inputMethodManager = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); if (inputMethodManager! = null) {inputMethodManager.toggleSoftInput (InputMethodManager.SHOW_FORCED, 0); } <code>
shareef 2013 년

7
그는 "프로그래밍 방식"이라고 말합니다.
Mert Akcakaya

2
나를 위해 작동하지 않습니다. 대신 다음을 수행합니다. android : windowSoftInputMode = "stateAlwaysVisible"
Rendicahya 2013 년

34

아래 코드를 따르십시오. 나는 당신의 문제가 해결 될 것이라고 확신합니다.

if (imm != null){
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
   } 

안녕하세요, 방금 onCreate 함수 내에 코드를 붙여 넣었지만 여전히 내 활동에 변경 사항이 없습니다. 코드를 붙여 넣으려면 주석에 붙여 넣겠습니다.
Vignesh 2011

소프트 키보드에 액세스하려면 문제를 해결할 수 있도록 알려주십시오. 코드를 보내주세요 .... 가능하다면
AndroidDanger 2011

선형 레이아웃 외에는 아무것도없는 내 활동에 onKeyboardActionListener를 설정하고 싶습니다.
Vignesh 2011

귀하가 제공 한 코드로 코드를 편집 한 위의 질문을 참조하십시오.
Vignesh 2011

이 활동은 키보드 동작에만 해당됩니다. onKeyboardActionListener를 사용하여 눌러 진 각 키를 듣고이를 동시에 로컬 서버로 전달하겠습니다
Vignesh 2011

25

이것은 작품입니다

<activity
    ...
    android:windowSoftInputMode="stateVisible" >
</activity>

또는

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

2
이를 설정하는 프로그래밍 방식에 감사드립니다. 이것은 작동하지만 InputMethodManager 해킹은 그렇지 않습니다.
Martin Vysny

17

내가 필요한 것은 매우 정확한 순간에 키보드를 노출하는 것뿐이었습니다. 이것은 나를 위해 일했습니다! 감사합니다 Benites.

    private Handler mHandler= new Handler();

그리고 매우 정확한 순간에 :

    mHandler.post(
    new Runnable() {
        public void run() {
            InputMethodManager inputMethodManager =  (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
            inputMethodManager.toggleSoftInputFromWindow(yourEditText.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);
            yourEditText.requestFocus();
        }
    }); 

이 솔루션은 onResume () 내부에서 포스트 작업을 지연시키는 데 약간의 수정 postDelayed( runnable, 500 /* msec */ );
을가했습니다

1
임의의 시간 동안 기다릴 필요가 없도록 첫 번째 레이아웃에서 호출되도록 ViewTreeObserver 콜백에 넣는 것이 좋습니다. 더 안전하고 반응성이 높아야합니다.
가브리엘

이 솔루션 만이 저에게 효과적이었습니다. 이전에 작동했던 이전 방법이 있었지만 안타깝게도 최신 OS에서는 핸들러가 실행 가능한 솔루션입니다.
MD. Shafiul Alam Biplob 19 dec.

12

다음 줄을 사용하여 onclick 이벤트 내에서 수동으로 소프트 키보드를 표시했습니다.

public void showKeyboard(final EmojiconEditText ettext){
          ettext.requestFocus();
          ettext.postDelayed(new Runnable(){
            @Override public void run(){
              InputMethodManager keyboard=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
              keyboard.showSoftInput(ettext,0);
            }
          }
        ,200);
        }

9

onResume 메소드에 넣으십시오.

findViewById(R.id.root_view_of_your_activity_layout).post(
new Runnable() {
    public void run() {
        InputMethodManager inputMethodManager =  (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
        inputMethodManager.toggleSoftInputFromWindow(yourEditText.getApplicationWindowToken(),     InputMethodManager.SHOW_FORCED, 0);
        yourEditText.requestFocus();
    }
});

OS가 onResume 메서드를 실행할 때 모든 뷰를 그릴 수 있는지 확인할 수 없기 때문에 runnable이 필요하므로 루트 레이아웃에서 호출 된 post 메서드는 모든 뷰가 준비 될 때까지 대기하게합니다.


1
DialogFragment에 SearchView가 있었고 대화 상자가 처음 나타 났을 때 SearchView에 포커스가 있었지만 사용자가 터치하지 않는 한 키보드가 작동하지 않았습니다. 우리는 그냥 onResume ALONE ... 또는 OnFocusChangeListener for the SearchView ...에서 showSoftInput과 toggleSoftInputFromWindow를 사용하려고했지만 창이 시작되고 그려지기 전에 실행되는 것처럼 보였기 때문에 작동하지 않았습니다 ..... .OnResume 에서이 게시물 이벤트를 사용하여 마침내 해결되었습니다.
나병 환자

8

이것이 작동하는 것 같습니다

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_patientid);

        editText = (EditText)findViewById(R.id.selectPatient);
        //editText.requestFocus(); //works without that

    }

@Override
    protected void onResume() {

        findViewById(R.id.selectPatient).postDelayed(
        new Runnable() {
            public void run() {
                 editText.requestFocus();
                InputMethodManager inputMethodManager =  (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                inputMethodManager.showSoftInput(editText,InputMethodManager.SHOW_IMPLICIT);
            }
        },100);
        super.onResume();
    }

이것이 더 잘 작동하는 것 같습니다.

<application>
    <activity
        android:name="com.doodkin.myapp.ReportActivity"
        android:label="@string/title_activity_report"
        android:screenOrientation="sensor" 
        android:windowSoftInputMode="stateHidden" > // add this or stateVisible
    </activity>
</application>

매니페스트가 Android 4.2.2에서 작동하지만 Android 4.0.3에서 작동하지 않는 것 같습니다.


8

에서 onCreate 활동 방법 또는 onActivityCreated 단편

....
view.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
        @Override
        public boolean onPreDraw() {
            view.removeOnPreDrawListener(this);
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

            // !Pay attention to return `true`
            // Chet Haase told to 
            return true;
        }
    });

6

나는 이와 같이 소프트 키보드를 프로그래밍 방식으로 표시하는 데 사용했으며 키보드를 시작하는 동안 화면의 자동 크기 조정을 방지하기 위해 사용되었습니다.

매니페스트에서 :

<activity android:name="XXXActivity" android:windowSoftInputMode="adjustPan">
</activity>

XXXActvity에서 :

EditText et =  (EditText))findViewById(R.id.edit_text);  
  Timer timer = new Timer();
            TimerTask task = new TimerTask() {

                @Override
                public void run() {
                    InputMethodManager inputMethodManager=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                    inputMethodManager.toggleSoftInputFromWindow(et.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);

                }
            };
            timer.schedule(task, 200);

나는 이것이 다른 사람들 이이 문제를 찾는 데 시간을 절약 할 것이라고 가정합니다.


앱을 종료하더라도 작품,하지만 키보드가 계속 표시하고, 앱을 다시 열면 키보드를 닫으면 키보드가 표시되지 않습니다
nulll

나는 지금 까지이 문제에 직면하지 않았습니다. 나는 그것이 장치 문제라고 가정합니다.
Noundla하기 Sandeep

타이머가 필요한 이유는 무엇입니까? 더 깊이 들어가기 위해 링크를 추가 할 수 있습니까?
nulll

6

Kotlin

fun hideKeyboard(activity: Activity) {
    val view = activity.currentFocus
    val methodManager = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(view != null)
    methodManager.hideSoftInputFromWindow(view!!.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
}

private fun showKeyboard(activity: Activity) {
    val view = activity.currentFocus
    val methodManager = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(view != null)
    methodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
}

자바

public static void hideKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager methodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    assert methodManager != null && view != null;
    methodManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}

private static void showKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager methodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    assert methodManager != null && view != null;
    methodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
}

3
InputMethodManager inputMethodManager=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

3

다음과 같이 싱글 톤으로 사용했습니다.

public static void showSoftKeyboard(final Context context, final EditText editText) {
        try {
            editText.requestFocus();
            editText.postDelayed(
                    new Runnable() {
                        @Override
                        public void run() {
                            InputMethodManager keyboard = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
                            keyboard.showSoftInput(editText, 0);
                        }
                    }
                    , 200);
        } catch (NullPointerException npe) {
            npe.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

다음과 같은 활동에서 사용하십시오.

showSoftKeyboard(this, yourEditTextToFocus);

함수 자체뿐만 아니라 함수 사용법에 대한 짧은 스 니펫을 포함 해 주셔서 대단히 감사합니다. 내가 필요한대로 정확히 작동합니다!
Chad Wilson

3

이것은 작동합니다 :

private static void showKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}

그리고이 메서드를 다음과 같이 호출합니다.

showKeyboard(NameOfActivity.this);

2

InputMethodManager.SHOW_FORCED는 좋은 선택이 아닙니다. 이 설정을 사용하는 경우 키보드 상태 숨기기를 관리해야합니다. 내 제안은 다음과 같습니다.

    public void showSoftKeyboard(View view) {
    InputMethodManager inputMethodManager = (InputMethodManager) getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE);
    view.requestFocus();
    inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
}

또한 매개 변수를 가져 오는 뷰 (일반적으로 EditText)에 집중할 수 있습니다. 이것은 더 유용한 기능을 만듭니다

InputMethodManager.SHOW_IMPLICIT 및 SHOW_FORCED에 대한 자세한 정보 InputMethodManager


1

다음은 필수 소스 코드입니다.

public static void openKeypad(final Context context, final View v) 
 {
new Handler().postDelayed(new Runnable() 
{
    @Override
    public void run() 
    {
        InputMethodManager inputManager =   (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE); 
        inputManager.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT);    
        Log.e("openKeypad", "Inside Handler");
    }
},300);}

자세한 내용은이 링크를 참조하십시오. 이것은 나를 도왔다. https://github.com/Nikhillosalka/Keyboard/blob/master/README.md


1
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

onResume ()에서 위의 코드를 사용하여 소프트 키보드를 엽니 다.


1

@ShimonDoodkin의 답변과 유사하게 이것은 내가 조각에서 한 일입니다.

https://stackoverflow.com/a/29229865/2413303

    passwordInput.postDelayed(new ShowKeyboard(), 300); //250 sometimes doesn't run if returning from LockScreen

어디 ShowKeyboard있다

private class ShowKeyboard implements Runnable {
    @Override
    public void run() {
        passwordInput.setFocusableInTouchMode(true);
        passwordInput.requestFocus();            
        getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        ((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(passwordInput, 0);
    }
}

성공적으로 입력 한 후 키보드를 숨겼는지 확인합니다.

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE))
                    .hideSoftInputFromWindow(getView().getWindowToken(), 0);

1
public final class AAUtilKeyboard {

public static void openKeyboard(final Activity activity, final EditText editText) {
    final InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    if (imm != null) {
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
    }
}

public static void hideKeyboard(final Activity activity) {
    final View view = activity.getCurrentFocus();
    if (view != null) {
        final InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm != null) {
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
    }
}

0

이미 너무 많은 답변이 있지만 이것 외에는 아무것도 효과가 없었습니다.

inputMethodManager.showSoftInput(emailET,InputMethodManager.SHOW_FORCED);

나는 showSoftInput함께 사용SHOW_FORCED

그리고 내 활동은

 android:windowSoftInputMode="stateVisible|adjustResize"

이것이 누군가에게 도움이되기를 바랍니다


0

이 방법을 기본 활동에 게시하고 매력과 같은 다른 활동을 사용하십시오.

public void openKeyboard() {
    InputMethodManager imm =
            (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if (imm != null) {
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.