편집 텍스트에 초점을 맞출 때 소프트 키보드를 표시하는 방법


461

EditText초점이 맞았을 때 (기기에 물리적 키보드가없는 경우) 소프트 키보드를 자동으로 표시 하고 싶은데 두 가지 문제가 있습니다.

  1. 내가 Activity표시되면 EditText초점이 맞았지만 키보드가 표시되지 않는 경우 키보드를 다시 표시하려면 키보드를 다시 클릭해야합니다 (내가 표시되면 표시되어야 함 Activity).

  2. 키보드에서 완료를 클릭하면 키보드가 닫히지 만 EditText초점 이 유지되고 원하지 않습니다 (편집이 완료되었으므로).

다시 시작하기 위해 내 문제는 iPhone에서 더 많은 EditText것을 얻는 것입니다.


<EditText android : id = "@ + id / myEditText"android : layout_width = "fill_parent"android : layout_height = "wrap_content"android : imeOptions = "actionDone"/>과 같은 기본 EditText가 있습니다. this : EditText editTxt = (EditText) findViewById (R.id.myEditText); editTxt.requestFocus ();
Ludovic Landry

2
이것은이 게시물의 어떤 대답보다 나에게 도움이되었습니다 : stackoverflow.com/a/2418314/1491212
Armel Larcier

답변:


628

소프트 키보드를 강제로 표시하려면

EditText yourEditText= (EditText) findViewById(R.id.yourEditText);
yourEditText.requestFocus();
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);
}

2
이 작업을 수행하면 활동이 나타날 때 소프트 키보드가 표시되지만 (좋아요) 포커스가 EditText를 떠나 버튼으로 이동하면 키보드가 그대로 유지됩니다 (나쁜 것입니다).
Ludovic Landry

157
이미 포커스가있는 대화 상자의 EditText에서 작동하지 않습니다. 이유가 확실하지 않습니다.
Matthias

10
@AbdellahBenhammou, 소프트 입력을 표시하기 전에 편집 텍스트에서 requestFocus 호출을 수행하면 문제가 해결 될 수 있습니다. 그것은 나를 위해했다.
r1k0

18
@AbdellahBenhammou, DialogFragment의 onCreate ()에서이 작업을 수행하십시오. getDialog (). getWindow (). setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
Phillip

22
yourEditText.requestFocus()여기에 설명 된대로 함께 작동 했습니다 : stackoverflow.com/questions/8991522/…
비벡 펜디

231

나는 같은 문제가 있었다. 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 (에뮬레이터)에서 테스트했습니다.

이 접근 방식은 나에게 많은 고통을 덜어 주었다.


48
나는 무언가가 너무 추악하고 너무 아름 다울 수 있다는 것을 몰랐습니다. 정말 고맙습니다!
mkerley

15
@jellyfish 이것은의 탭을 시뮬레이션합니다 EditText. 이것을 읽는 다른 사람들을 위해, 새로 작성하는 대신 위젯 자체 Handler에서 View.postDelayed()메소드를 사용할 수도 있습니다 yourEditText.
Tony Chan

5
이것은 David Chandler의 해킹입니다.
벤 베드 슨

4
David Chandler의 솔루션이 모든 Android 버전 / 장치에서 작동하고 VISIBILITY가 GONE에서 VISIBLE로 변경된 경우에는 YES입니다. 대신 그의 솔루션을 사용해야합니다.
Mike Keskinov 2019

3
동의했다. 모든 Android 버전에서 작동하는 더 나은 솔루션을 알고 있습니까?
Mike Keskinov

162

키보드가 나타나게하려면

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

이 메소드는 InputMethodManager를 직접 호출하는 것보다 더 안정적입니다.

닫으려면

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

12
누군가 직접 호출하는 것보다 왜 이것이 더 신뢰할 수 있는지 설명해 줄 수 있습니까 InputMethodManager? (하나의 경우 raukodraug의 솔루션과 달리 작동하지 않습니다.)
Matthew Quiros

5
나에게도 효과가 없다. 안드로이드 2.3.5에서 작업. raukodraug의 솔루션이 저에게 효과적입니다. 버전 종속성을 검색했지만 찾을 수 없습니다.
Hugo Logmans

2
이것은 Android 4.4.2에서 나를 위해 일했습니다. 이 게시물의 솔루션으로 선택된 InputMethodManager 메서드가 작동하지 않았습니다.
Phil

답변에서 메소드를 사용한 후 이것을 추가하고 작동했지만 작동하지 않았습니다. 고맙습니다
Manny265

2
Android 4.4.2에서 작동하지 않았습니다. 키보드를 표시하지만 숨기지 않았습니다.
John J Smith

87

아무것도 작동하지 않으면 강제로 표시하십시오 .

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

그런 다음 나중에 닫으려면 예를 들어 onPause ()에서 다음을 호출 할 수 있습니다.

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

4
당신은 맞습니다, @Bolling! 아무것도 작동하지 않으면 코드가 저를 구했습니다. 감사!
Willian Paixao

3
귀하의 코드는 나를 위해 일한 유일한 코드 이며이 페이지의 모든 솔루션을 시도했습니다! 고마워요!
Mattia Ruggiero

4
강요하지 마십시오. 경우에 따라 포 그라운드에서 백그라운드로 이동할 때 키보드는 강제로 실행되기 때문에 키보드가 그대로 유지됩니다. 파편화 문제이지만 삼성 듀오에서 보았습니다.
j2emanue

키보드를 강제로 닫지 않아도 키보드가 멈추는 것을 보았으므로 항상 키보드 onPause ()를 닫는 코드가 항상 있습니다.
볼링

그것은 효과가 있었지만 다른 화면으로 이동할 때 여전히 열려 있습니다
Sithu

75

다음 코드는 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);
    }
});

감사! 놀랍도록 잘 작동합니다. 그리고이 문제에 대해 읽은 모든 답변과 주제에서 내가 더 편한 솔루션입니다.
Rui

37
:-D setImeVisibility(hasFocus)?
마티아스

실제로 "내 자신의 검색보기를 롤링"했기 때문에이 방법을 시도했습니다 (필요하지는 않았지만 이유가 있음). 이것은 활동 시작을 제외하고는 나를 위해 일했습니다. 활동에 android : windowSoftInputMode = "alwaysVisible"을 추가했으며 이미 편집 텍스트에서 requestFocus ()가 호출되었습니다. 챔피언처럼 작동합니다.
javahead76

removeCallbacks (mShowImeRunnable) 필요하십니까? 실행 파일을 대기열에서 실행하도록 선택하면 대기열에서도 동시에 제거 될 것이라고 생각 했습니까?
Cheok Yan Cheng

1
여러 변형을 시도한 후에 이것은 나에게 일관되게 작동하는 유일한 방법이었습니다 (Android 4.42). Thx
John J Smith

34

android:windowSoftInputMode="stateAlwaysVisible" 매니페스트 파일에서->

edittext.requestFocus(); 코드에서->.

활동이 나타날 때 편집 텍스트에 포커스를 요청하는 소프트 키보드가 열립니다.


2
액티비티 생성시 키보드가 열립니다.
xpto

질문에 대답하지 않지만 나를 도와주었습니다 :)
S.Thiongane

api 22에서 requestfocus없이 키를 엽니 다
David

내 경우에는 잘 작동합니다. XML에서 요청 포커스 속성이 왜 언급되어야하는지 궁금 manifest합니다.
sud007

30

아래 코드를 사용하여 간단한 경우에 최근 운이 좋았습니다. 모든 테스트를 완료하지는 못했지만 ...

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

키보드가 표시됩니다.


제 경우에는 옵션 정보를 추가 할 수있는 버튼이있었습니다. button.onClick 핸들러에는 위의 코드가 추가되어 선택적 정보를 입력 할 때 소프트 키보드가 나타나도록합니다. 이드 2.2.2
덴트

이것은 좋은 솔루션이지만 사용 후 MotionEvent 객체를 만들고 recycle ()을 호출하여 나중에 호출자가 다시 사용하는 것을 잊지 마십시오.
jimbob

인수로 ACTION_UP을 사용하는 dispatchTouchEvent ()가 하나만 필요합니다.
Mohammed Junaid

15

소프트 키보드가 나타나도록 강요 할 수 있습니다.

...
dialog.show();
input.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

1
이것은 나를 위해 작동합니다 ... 나는이 InputMethodManager를 시도했다 imm = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); imm.showSoftInput (이름, inputMethodManager.SHOW_IMPLICIT); 또는 getWindow (). setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); 그러나 그들 중 누구도 일하지 않았습니다.
Günay Gültekin

10

때로는 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());
            }
        }
    });

1
이 5 안드로이드에 나를 위해 일한 유일한 솔루션입니다
user1021430

10

키보드를 숨기려면 다음 중 하나를 사용하십시오.

getActivity().getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

키보드를 표시하려면

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

DialogFragment의 경우이를 재정의 된 것으로 호출 onStart()할 수 getDialog().getWindow()있으며의 대안으로 사용할 수 있습니다 getActivity().getWindow().
Mr-IDE

10

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

내가 찾던 것.
lasec0203

8

조각의 경우 작동하는지 확인하십시오.

 displayName = (EditText) view.findViewById(R.id.displayName);
    InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

7

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

입력 모드를 설정해야한다고 생각했습니다. (매니페스트의 Activity 구성 요소)

android:windowSoftInputMode="stateVisible" 

6

액티비티 애니메이션이 소프트 키보드를 비활성화 할 수 있음을 발견했을 때 소프트 키보드에 대한 내 문제를 믿거 나 말거나 해결했습니다. 당신이 의도를 호출하면

i.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);

overridePendingTransition(0, 0);

소프트 키보드를 숨길 수 있으며 표시 할 방법이 없습니다.


6

나는 다양한 상황에서 같은 문제가 있었고, 내가 찾은 솔루션은 일부에서는 작동하지만 다른 곳에서는 작동하지 않으므로 찾은 대부분의 상황에서 작동하는 결합 솔루션이 있습니다.

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

6
editText.post(new Runnable() {
    @Override
    public void run() {
        InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
    }
});

6

나는 여기에 모든 것을 결합했고 나를 위해 작동합니다.

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

6

그것은 나를 위해 일했다. 키보드를 표시하기 위해 이것을 시도해 볼 수도 있습니다.

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

5

코드 스 니펫. . .

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

5

Kotlin 키보드를 포커스에 표시하기위한 확장.

이것은 너무 길거나 불완전한 이전 응답의 조합입니다.

이 확장 기능은 메시지 큐에 실행 파일을 게시하여 포커스를 요청한 후 소프트 키보드를 표시합니다.

fun View.showSoftKeyboard() {
    post {
        if (this.requestFocus()) {
            val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            imm?.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
        }
    }
}

나중에 필요할 때 모든보기에서 호출하십시오.

editText.showSoftKeyboard()


4
final InputMethodManager keyboard = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

4

매니페스트 내부 :

android:windowSoftInputMode="stateAlwaysVisible"-처음에 키보드를 시작했습니다. android:windowSoftInputMode="stateAlwaysHidden" -처음에는 숨겨진 키보드.

"adjustPan"키보드가 시작되면 화면이 자동으로 조정되기 때문에 사용하고 싶습니다 .

 <activity
      android:name="YourActivity"
      android:windowSoftInputMode="stateAlwaysHidden|adjustPan"/>

4

EditText보기에이 줄을 추가하면됩니다.

android:isScrollContainer="true"

그리고 TADA-키보드가 자동으로 나타나기 시작했습니다!

나는 비슷한 문제가 있었고이 간단하고 이상한 해결책을 발견했습니다.

user3392439에 의해 이미 언급 된 바와 같이, 포커스에 따른 키보드의 출현은 XML 파일의 스크롤 구성 요소의 존재와 어렴풋이 연결되어있다.

심지어 존재 다른 같은 XML에 언급 된 라인을 포함 글고보기는 키보드 EditTexts 중 하나가 현재 집중 상관없이 나타날 수 있습니다.

XML 파일에 스크롤 구성 요소를 포함하는 하나 이상의 가시적 뷰 가있는 경우 키보드가 초점에 자동으로 나타납니다.

스크롤이 없으면 키보드가 나타나도록 EditText를 클릭해야합니다.


이것은 매우 이상하다하지만 확실히 작동 - I가 시도하는 requesFocus()클릭 핸들러 내에서이 명시 적 showSoftInput SHOW_FORCED보다 유일한 방법은 다른 것입니다
그린

고마워, 고마워 왜 작동하는지 전혀 알지 못하지만 다른 제조업체의 8 개 장치에서 테스트했으며 매번 작동했습니다!
안토니오 블라 시크

3

위에 주어진 모든 솔루션 ( OnFocusChangeListener.OnFocusChange 리스너의 InputMethodManager 상호 작용은 EditText에 첨부 됨 은 활동에서 단일 편집이 있으면 잘 작동합니다.

제 경우에는 두 가지 편집이 있습니다.

 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 텍스트에 포커스가있는 경우 키보드 표시"


3

활동의 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;
  }

무엇입니까 WidgetUtils.showKeyboard? 이것이 가장 중요한 부분입니다.
TWiStErRob

2

대답 중 어느 것도 나를 위해 일하지 않았습니다. 간단한 방법이 있습니다.

searchEditText.setVisibility(View.VISIBLE);
                final Handler handler=new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        searchEditText.requestFocus();
                    }
                }, 400);

400ms 동안 requestFocus () 메소드를 지연 시켰습니다.


많은 감사합니다, 그것은 ... 키보드를 보여주는 일부 지연을 필요
hkh114

1

내 앱 중 하나에서 소프트 키보드가 자동으로 활동을 입력 할 때 (onCreate에 editText.requestFocus ()가 있음) 이상한 동작을 발견했습니다.

더 자세히 살펴보면 레이아웃 주위에 ScrollView가 있기 때문이라는 것을 알았습니다. ScrollView를 제거하면 원래 문제 설명에 설명 된대로 동작이 나타납니다. 이미 포커스가있는 editText를 클릭 할 때만 소프트 키보드가 나타납니다.

그것이 효과가 없다면 ScrollView를 넣어보십시오. 어쨌든 무해합니다.


1

나는 한 보기 애니메이션을 사용하여 비슷한 문제 . 따라서 표시된 편집 텍스트에서 키보드 액세스를 요청하기 전에 애니메이션이 끝나기기다릴 수 있도록 애니메이션 리스너를 배치했습니다.

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

1

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

문안 인사.

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