Android : 포커스가 EditText에있을 때 소프트 키보드를 자동으로 표시


341

를 사용하여 입력 상자를 표시하고 AlertDialog있습니다. 을 EditText호출하면 대화 상자 내부에 자동으로 초점이 맞춰 AlertDialog.show()지지만 소프트 키보드는 자동으로 표시되지 않습니다.

대화 상자가 표시 될 때 소프트 키보드가 자동으로 표시되도록하려면 어떻게합니까? (물리적 / 하드웨어 키보드가 없습니다). 검색 단추를 눌러 전체 검색을 호출하는 방법과 유사하게 소프트 키보드가 자동으로 표시됩니다.


1
아래 의 Ted 의견에 따라 자동으로 발생 합니다. 먼저 확인하십시오!
Cheezmeister

이 답변은 가장 간단하고 잘 작동합니다. stackoverflow.com/a/8018630/89818
caw


1
나는 수년에 걸쳐이 답변에 여러 번 돌아 왔습니다. 항상 대화 상자 안에 있어이 문제가 발생하지 않으며 조각이나 활동이 아닙니다.
tir38

답변:


305

당신은에 포커스 청취자를 만들 수 있습니다 EditTextAlertDialog후 얻을, AlertDialog'들 Window. 거기에서을 호출하여 소프트 키보드 쇼를 만들 수 있습니다 setSoftInputMode.

final AlertDialog dialog = ...;

editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        }
    }
});

5
AlertDialog.Builder를 사용하여 어떻게합니까? ... final AlertDialog.Builder alert = new AlertDialog.Builder (Main.this);
Stephen

6
당신은 사용하여 빌더에서 대화 상자를 얻을 수 @Stephen final AlertDialog dialog = builder.create()하고 show대신 빌더의 대화 상자에서.
tidbeck

30
위의 의견을 철회 합니다. 초점을 제대로 맞출 수 없으면 XML을 살펴보십시오! <requestFocus> </ requestFocus> 태그가 보이면 제거하십시오. 태그가 EditText에 포커스를 둔 것처럼 보이고 EditText에 이미 포커스가 있으므로 리스너가 시작되지 않습니다.
Ted

11
장치에 하드웨어 키보드가있는 경우 어떻게하지 않습니까? 이 사용자에게는 성가신 것 같습니다.
mxcl

8
이것이 왜 이것이 SDK의 기본 동작이 아닌지 이해하지 못합니다. 텍스트 입력이 필요한 뷰에 깜박이는 커서가 표시되면 누군가 키보드를 사용하여 텍스트를 입력하지 않으려는 이유는 무엇입니까? 그것은 나에게 UX의 잘못된 느낌
Christian García

240

키보드 사용을 보여주기 위해 :

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

키보드 사용을 숨기려면 :

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(),0); 

3
이것은 VISIBLE과 GONE 사이의 레이아웃에서보기의 가시성을 토글하여 소프트 키보드를 표시하거나 숨길 때 특히 효과적입니다.
PacificSky

38
SHOW_IMPLICIT 플래그를 대신 사용하는 것이 좋습니다. 즉, 활동을 변경하거나 응용 프로그램이 키보드를 자동 숨기기로 예상한다는 것을 의미하기 때문입니다.
drspaceboo

6
@drspaceboo SHOW_IMPLICIT를 사용하면 전혀 작동하지 않습니다. SHOW_FORCED를 사용해야합니다. 이유가 확실하지 않습니다 ...
Yoann Hercouet

1
위 코드는 언제 실행해야합니까? 레이아웃을 부모에 추가 한 직후에 시도했습니다. 작동하지 않았습니다. 그러나 레이아웃이 얼마 남지 않은 후에 그것을했다면 제대로 작동했습니다. "지금 키보드를 보여 주려고하면 실제로 작동합니다"라는 콜백이 있습니까?
William Jockusch

1
toggleSoftInput (InputMethodManager.SHOW_FORCED, 0)은 소프트 키보드를 토글합니다. 키보드가 표시되도록하려면 대신 imm.showSoftInput (view, InputMethodManager.SHOW_IMPLICIT)을 사용할 수 있습니다. 여기서 view는 입력을 가져 오는 View입니다.
PJ_Finnegan

111

대화 상자를 만든 후 바로 소프트 키보드를 요청할 수 있습니다 (SDK-r20에서 테스트).

// create dialog
final AlertDialog dialog = ...; 

// request keyboard   
dialog.getWindow().setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

궁금한 사람은 하드웨어 키보드가 연결되어있을 때이 방법으로 소프트 키보드를 열 수 없습니다. 방금 USB On-The-Go 케이블로 테스트했습니다. 완전한!
13rac1

이것은 나를 위해 아무것도하지 않습니다.
JohnyTex

하드웨어 키보드가 없습니다. 아마 configuration (?)
JohnyTex

25

나는 같은 문제가 있었고 다음 코드로 해결했다. 하드웨어 키보드가있는 전화에서 어떻게 작동하는지 잘 모르겠습니다.

// TextEdit
final EditText textEdit = new EditText(this);

// Builder
AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setTitle("Enter text");
alert.setView(textEdit);

alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        String text = textEdit.getText().toString();
        finish();
    }
});

alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        finish();
    }
});

// Dialog
AlertDialog dialog = alert.create();
dialog.setOnShowListener(new OnShowListener() {

    @Override
    public void onShow(DialogInterface dialog) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(textEdit, InputMethodManager.SHOW_IMPLICIT);
    }
});

dialog.show();

그것은에서의 대화 수준의 API 레벨 8
tidbeck

반드시 나중에 제거 된 : /
제이 섹 Kwiecień

@Xylian 그것은 문서에 아직 ) Dialog.setOnShowListener (
tidbeck


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

또는

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

많은 친구에게 감사합니다. 굉장했습니다. 실제로 두 가지 모두 문제를 해결하기 위해 사용했습니다. 사용자가 추가 모드에 있으면 활동 시작시 키보드를 표시해야하며 업데이트 모드의 경우 키보드가 필요하지 않은 상황이 있습니다. 기본적으로. 그래서 내가 설정 한 활동에 대한 매니페스트에서 stateHidden사용자가 새 항목을 생성하는 것을 감지하면 언급 한 코드 줄을 사용하여 키보드를 표시했습니다. :) 다시 한번 감사합니다.
PHP Avenger

'getWindow ()를 해결할 수 없습니다'라는 메시지가 나타납니다. 나는 'this'를 넣어 보았습니다. 그 전에 다른 것들. 화면의 특정 부분을 클릭하여 편집 텍스트를 사용하지 않고 키보드를 가져오고 싶습니다.
Androidcoder

1
@Androidcoder, 그것은 활동의 일부이므로 다음과 같은 것을 추가하십시오 ((Activity) context).getWindow().....
CoolMind

15

다른 답변에서 코드 조각이 작동,하지만 당신은을 사용하는 경우 특히, 코드에 배치 할 위치를 항상 명확하지 않다 AlertDialog.Builder과 다음 공식 대화 튜토리얼 은 사용하지 않기 때문에 final AlertDialog ...alertDialog.show().

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

~보다 바람직하다

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

SOFT_INPUT_STATE_ALWAYS_VISIBLE은 포커스가 EditText에서 멀어지면 키보드를 숨기므로 SHOW_FORCED는 사용자가 홈 화면으로 돌아가거나 최근 앱을 표시하더라도 키보드가 명시 적으로 해제 될 때까지 키보드를 계속 표시합니다.

다음은 XML로 정의 된 EditText를 가진 사용자 정의 레이아웃을 사용하여 생성 된 AlertDialog의 작업 코드입니다. 또한 키보드에 "go"키가 있도록 설정하고 양수 버튼을 트리거 할 수 있습니다.

alert_dialog.xml :

<RelativeLayout
android:id="@+id/dialogRelativeLayout"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" >

    <!-- android:imeOptions="actionGo" sets the keyboard to have a "go" key instead of a "new line" key. -->
    <!-- android:inputType="textUri" disables spell check in the EditText and changes the "go" key from a check mark to an arrow. -->
    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:layout_marginLeft="4dp"
        android:layout_marginRight="4dp"
        android:layout_marginBottom="16dp"
        android:imeOptions="actionGo"
        android:inputType="textUri"/>

</RelativeLayout>

AlertDialog.java :

import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatDialogFragment;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.widget.EditText;

public class CreateDialog extends AppCompatDialogFragment {
    // The public interface is used to send information back to the activity that called CreateDialog.
    public interface CreateDialogListener {
        void onCreateDialogCancel(DialogFragment dialog);    
        void onCreateDialogOK(DialogFragment dialog);
    }

    CreateDialogListener mListener;

    // Check to make sure that the activity that called CreateDialog implements both listeners.
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mListener = (CreateDialogListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement CreateDialogListener.");
        }
    }

    // onCreateDialog requires @NonNull.
    @Override
    @NonNull
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity());
        LayoutInflater customDialogInflater = getActivity().getLayoutInflater();

        // Setup dialogBuilder.
        alertDialogBuilder.setTitle(R.string.title);
        alertDialogBuilder.setView(customDialogInflater.inflate(R.layout.alert_dialog, null));
        alertDialogBuilder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                mListener.onCreateDialogCancel(CreateDialog.this);
            }
        });
        alertDialogBuilder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                mListener.onCreateDialogOK(CreateDialog.this);
            }
        });

        // Assign the resulting built dialog to an AlertDialog.
        final AlertDialog alertDialog = alertDialogBuilder.create();

        // Show the keyboard when the dialog is displayed on the screen.
        alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

        // We need to show alertDialog before we can setOnKeyListener below.
        alertDialog.show();

        EditText editText = (EditText) alertDialog.findViewById(R.id.editText);

        // Allow the "enter" key on the keyboard to execute "OK".
        editText.setOnKeyListener(new View.OnKeyListener() {
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                // If the event is a key-down event on the "enter" button, select the PositiveButton "OK".
                if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
                    // Trigger the create listener.
                    mListener.onCreateDialogOK(CreateDialog.this);

                    // Manually dismiss alertDialog.
                    alertDialog.dismiss();

                    // Consume the event.
                    return true;
                } else {
                    // If any other key was pressed, do not consume the event.
                    return false;
                }
            }
        });

        // onCreateDialog requires the return of an AlertDialog.
        return alertDialog;
    }
}

11

글쎄, 이것은 꽤 오래된 게시물이지만 여전히 추가 할 것이 있습니다.
다음은 키보드를 제어하는 ​​데 도움이되는 두 가지 간단한 방법이며 완벽하게 작동합니다.

키보드 표시

public void showKeyboard() {
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    View v = getCurrentFocus();
    if (v != null)
        imm.showSoftInput(v, 0);
}

키보드 숨기기

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

무엇입니까 getCurrentFocus()?
CoolMind

나는 그것이 방법입니다 Activity.
CoolMind

10

유쿠 솔루션에 대한 추가 정보를 알려 드리겠습니다. 왜냐하면이 작업을 수행하기가 어렵다는 것입니다. AlertDialog.Builder에서 AlertDialog 객체를 어떻게 얻습니까? 글쎄, 그것은 내 alert.show()처형 의 결과입니다 .

final AlertDialog.Builder alert = new AlertDialog.Builder(getActivity());
final EditText input = new EditText(getActivity());
alert.setView(input);

// do what you need, like setting positive and negative buttons...

final AlertDialog dialog = alert.show();

input.setOnFocusChangeListener(new OnFocusChangeListener() {
   @Override
   public void onFocusChange(View v, boolean hasFocus) {
      if(hasFocus) {
         dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
      }
   }
});

7

IME 수동 숨기기 및 표시를 다루는 토론을 살펴보십시오 . 그러나 초점 EditText은 IME를 표시하지 않으면 화면이 실제로 표시되기 전에 호출 AlertDialog.show()되는 OnCreate()다른 방법을 호출하기 때문 입니다. 로 이동하면 OnPostResume()내가 믿는 경우에 문제를 해결해야한다.


6

그렇습니다 당신은 setOnFocusChangeListener그것으로 당신을 도울 것입니다 할 수 있습니다.

editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        }
    }
});

4

확장 기능을 사용하는 것이 텍스트 편집을 위해 키보드를 표시하는 더 좋은 방법이라고 생각합니다.

편집 텍스트 키보드를 표시하는 데 사용하는 방법은 다음과 같습니다.

kotlin 코드 : 전화 만하면됩니다edittext.showKeyboard()

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

자바 코드 :

public static void showKeyboard(EditText editText) {
    editText.post(new Runnable() {
      @Override
      public void run() {
        editText.requestFocus();
        InputMethodManager imm = (InputMethodManager) editText.getContext()
            .getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
      }
    });
  }

3

누군가가 얻는다면 :

활동 유형에서 비 정적 메소드 getSystemService (String)에 대한 정적 참조를 작성할 수 없습니다.

getSystemService 호출에 컨텍스트 를 추가 하십시오.

그래서

InputMethodManager imm = 
(InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

1

원래 질문은 대화 상자와 관련이 있으며 EditText는 정기적으로 표시됩니다. 어쨌든, 나는 이것이 당신 대부분에게도 효과가 있다고 생각합니다. 그래서 여기에 나를 위해 일하는 것이 있습니다 (위의 제안 된 최고 등급의 방법은 나를 위해 아무것도하지 않았습니다). 이 작업을 수행하는 사용자 정의 EditView가 있습니다 (하위 클래스는 필요하지 않지만 뷰가 표시 될 때 포커스를 잡고 싶기 때문에 목적에 편리하다는 것을 알았습니다).

이것은 실제로 tidbecks 답변과 거의 동일합니다. 나는 실제로 투표가 0이므로 그의 대답을 전혀 알지 못했습니다. 그런 다음 자신의 게시물에 댓글을 달려고했지만 너무 길었으므로 어쨌든이 게시물을 끝냈습니다. tidbeck은 키보드를 사용하는 장치에서 어떻게 작동하는지 잘 모르겠습니다. 두 경우 모두 동작이 똑같다는 것을 확인할 수 있습니다. 세로 모드에서는 소프트웨어 키보드가 팝업되고 가로 방향에서는 팝업되지 않습니다. 실제 키보드가 미끄러 져 나가거나 내 전화에 아무런 영향을 미치지 않습니다.

개인적으로 다음과 같이 사용하기에 약간 어색한 동작을 발견했습니다 InputMethodManager.SHOW_FORCED. 이것은 내가 원하는대로 작동합니다. 방향에 관계없이 키보드가 표시되지만 하드웨어 키보드가 미끄러 져 있으면 적어도 내 장치에서는 키보드가 나타나지 않습니다.

import android.app.Service;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;

public class BringOutTheSoftInputOnFocusEditTextView extends EditText {

    protected InputMethodManager inputMethodManager;

    public BringOutTheSoftInputOnFocusEditTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    public BringOutTheSoftInputOnFocusEditTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public BringOutTheSoftInputOnFocusEditTextView(Context context) {
        super(context);
        init();
    }

    private void init() {
        this.inputMethodManager = (InputMethodManager)getContext().getSystemService(Service.INPUT_METHOD_SERVICE);
        this.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (hasFocus) {
                    BringOutTheSoftInputOnFocusEditTextView.this.inputMethodManager.showSoftInput(BringOutTheSoftInputOnFocusEditTextView.this, InputMethodManager.SHOW_FORCED);
                }
            }
        });
    }

    @Override
    protected void onVisibilityChanged(View changedView, int visibility) {
        super.onVisibilityChanged(changedView, visibility);
        if (visibility == View.VISIBLE) {
            BringOutTheSoftInputOnFocusEditTextView.this.requestFocus();
        }
    }

}

1

문제는 텍스트를 입력하는 장소가 처음에 숨겨져 있거나 중첩 되어 있기 때문에 AlertDialog가 자동으로 플래그를 설정 WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM하거나 WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE사물이 표시되도록 소프트 입력을 트리거하지 않는 것 같습니다.

이 문제를 해결하는 방법은 다음을 추가하는 것입니다.

(...)
// Create the dialog and show it
Dialog dialog = builder.create()
dialog.show();

// After show (this is important specially if you have a list, a pager or other view that uses a adapter), clear the flags and set the soft input mode
dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

1

시도하고 사용하십시오 :

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

1

키보드를 보여 주려면 다음을 수행해야했습니다.

Android TextField : 프로그래밍 방식으로 포커스 + 소프트 입력 설정

근본적으로 해결책은 다음과 같습니다

@Override
public void onResume() {
    super.onResume();
    //passwordInput.requestFocus(); <-- that doesn't work
    passwordInput.postDelayed(new ShowKeyboard(), 325); //250 sometimes doesn't run if returning from LockScreen
}

어디 ShowKeyboard있다

private class ShowKeyboard implements Runnable {
    @Override
    public void run() {
        passwordInput.setFocusableInTouchMode(true);
        //passwordInput.requestFocusFromTouch(); //this gives touch event to launcher in background -_-
        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

이 메소드를 Util 클래스에 넣고 어디에서나 사용하십시오.

코 틀린

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);
}

1

누구나 관심을 가질 수 있도록 멋진 kotlin-esqe 확장 기능을 만들었습니다.

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

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

0

이것은 당신에게 좋은 샘플입니다 :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ScrollView
        android:id="@+id/scrollID"
        android:layout_width="fill_parent"
        android:layout_height="0dip"
        android:layout_weight="1" >

        <LinearLayout
            android:id="@+id/test"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >
        </LinearLayout>
    </ScrollView>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:baselineAligned="true"
        android:orientation="horizontal"
        android:paddingBottom="5dp"
        android:paddingLeft="5dp"
        android:paddingRight="5dp"
        android:weightSum="1" >

        <EditText
            android:id="@+id/txtInpuConversation"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="0.5"
            android:hint="@string/edt_Conversation" >

            <requestFocus />
        </EditText>

        <Button
            android:id="@+id/btnSend"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="0.5"
            android:text="@string/btn_Conversation" />
    </LinearLayout>

</LinearLayout>

0

이 답변이 필요한 이유-위의 해결 방법으로 키보드가 표시되지만 다른 곳을 클릭해도 사라지지 않습니다 EditText. 따라서 EditText초점을 잃을 때 키보드가 사라지도록 무언가를해야합니다 .

다음 단계를 수행하여이를 달성 할 수 있습니다.

  1. 다음 속성을 추가하여 상위보기 (활동의 컨텐츠보기)를 클릭 가능하고 집중 가능하게하십시오.

        android:clickable="true" 
        android:focusableInTouchMode="true" 
  2. hideKeyboard () 메소드 구현

        public void hideKeyboard(View view) {
            InputMethodManager inputMethodManager =(InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE);
            inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(),InputMethodManager.HIDE_IMPLICIT_ONLY );
        }
  3. 마지막으로 편집 텍스트의 onFocusChangeListener를 설정하십시오.

        edittext.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (!hasFocus) {
                    hideKeyboard(v);
                }
            }
        });

0

조금 까다 롭습니다. 나는 이런 식으로했고 효과가있었습니다.

1. 처음에는 창에서 소프트 입력을 숨기십시오. 소프트 키보드가 보이면 소프트 입력을 숨기거나 보이지 않으면 아무 것도하지 않습니다.

2. 대화 표시

3. 그러면 간단히 소프트 입력을 토글하기 위해 호출합니다.

암호:

InputMethodManager inputManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
//hiding soft input
inputManager.hideSoftInputFromWindow(findViewById(android.R.id.content).getWind‌​owToken(), 0);
//show dialog
yourDialog.show();
//toggle soft input
inputManager.toggleSoftInput(InputMethodManager.SHOW_FORCED,InputMethodManager.SHOW_IMPLICIT);

0

이 시도

SomeUtils.java

public static void showKeyboard(Activity activity, boolean show) {
    InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);

    if(show)
        inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
    else
        inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY,0);
}

0

많은 것을 시도했지만 이것이 나를 위해 일한 것입니다 (kotlin).

        val dialog = builder.create()
        dialog.setOnShowListener {
            nameEditText.requestFocus()
            val s = ContextCompat.getSystemService(requireContext(), InputMethodManager::class.java)
            s?.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0)
        }

        dialog.setOnDismissListener {
            val s = ContextCompat.getSystemService(requireContext(), InputMethodManager::class.java)
            s?.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0)
        }

        dialog.show()

0

https://stackoverflow.com/a/39144104/2914140를 보면 조금 단순화했습니다.

// In onCreateView():
view.edit_text.run {
    requestFocus()
    post { showKeyboard(this) }
}

fun showKeyboard(view: View) {
    val imm = view.context.getSystemService(
        Context.INPUT_METHOD_SERVICE) as InputMethodManager?
    imm?.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
}

https://stackoverflow.com/a/11155404/2914140 보다 낫습니다 .

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

홈 버튼을 누르고 홈 화면으로 이동하면 키보드가 열린 상태로 유지되기 때문입니다.


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

나는 활동에 왔을 때 키보드를 자동으로 표시하기 위해 onCreate ()에서 이것을 호출합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.