android inputmethodmanager - edittext가 집중 될 때 소프트 키보드를 표시하는 방법





keyboard focus android-edittext android-softkeyboard (25)


나는 모든 것을 여기에 결합했다. 그리고 나를 위해 그것이 일한다 :

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

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

  1. Activity 이 표시 될 때 EditText 에 초점이 맞춰졌지만 키보드가 표시되지 않으면 키보드를 다시 클릭해야합니다 (내 Activity 이 표시 될 때 표시되어야 함).

  2. 그리고 키보드에서 완료를 클릭하면 키보드가 닫히지 만 EditText 는 포커스를 유지하고 y는 (편집이 완료 되었기 때문에) 원하지 않습니다.

다시 시작하려면 내 문제는 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);



포커스를받을 때 소프트 키보드를 여는 것을 알고있는 EditText의 사용자 지정 확장을 만들 수도 있습니다. 그게 내가 끝내 준거야. 여기 나를 위해 일한 것이있다.

public class WellBehavedEditText extends EditText {
    private InputMethodManager inputMethodManager;
    private boolean showKeyboard = false;

    public WellBehavedEditText(Context context) {
        super(context);
        this.initializeWellBehavedEditText(context);
    }

    public WellBehavedEditText(Context context, AttributeSet attributes) {
        super(context, attributes);
        this.initializeWellBehavedEditText(context);
    }

    public WellBehavedEditText(Context context, AttributeSet attributes, int defStyleAttr) {
        super(context, attributes, defStyleAttr);
        this.initializeWellBehavedEditText(context);
    }

    public WellBehavedEditText(Context context, AttributeSet attributes, int defStyleAttr, int defStyleRes) {
        super(context, attributes, defStyleAttr, defStyleRes);
        this.initializeWellBehavedEditText(context);
    }

    private void initializeWellBehavedEditText(Context context) {
        this.inputMethodManager = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);

        final WellBehavedEditText editText = this;
        this.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                if(showKeyboard) {
                    showKeyboard = !(inputMethodManager.showSoftInput(editText, InputMethodManager.SHOW_FORCED));
                }
            }
        });
    }

    @Override
    protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
        if(!focused) this.showKeyboard = false;
        super.onFocusChanged(focused, direction, previouslyFocusedRect);
    }

    @Override
    public boolean requestFocus(int direction, Rect previouslyFocusedRect) {
        boolean result = super.requestFocus(direction, previouslyFocusedRect);
        this.showKeyboard = true;
        final WellBehavedEditText self = this;
        this.post(new Runnable() {
            @Override
            public void run() {
                showKeyboard = !(inputMethodManager.showSoftInput(self, InputMethodManager.SHOW_FORCED));
            }
        });
        return result;
    }
}



나는이 도움 클래스를 만들었다. 컨텍스트를 전달하고 초점을두고 키보드를 표시하고 숨겨진 키보드를 표시하려는보기를 전달하십시오. 나는 그것이 도움이되기를 바랍니다.

public class FocusKeyboardHelper {

private View view;
private Context context;
private InputMethodManager imm;

public FocusKeyboardHelper(Context context, View view){
    this.view = view;
    this.context = context;
    imm = (InputMethodManager) context.getSystemService(context.INPUT_METHOD_SERVICE);
}

public void focusAndShowKeyboard(){

    view.requestFocus();
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);

}

public void hideKeyBoard(){
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

}




다음 코드는 SearchView 용 Google의 4.1 소스 코드에서 약혼 한 것입니다. 덜 안드로이드 버전에서도 잘 작동합니다.

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



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

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




나는 여러 가지 다른 상황에서 같은 문제가 있었고, 해결책은 내가 찾은 대부분의 상황에서 작동하는 결합 솔루션입니다.

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



키보드를 나타나게하려면 다음을 사용하십시오.

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

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

그것을 닫으려면, 다음을 사용하십시오.

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



뷰 애니메이션을 사용하여 비슷한 문제가 발생했습니다 . 그래서 애니메이션 리스너를 넣어 애니메이션이 끝나기를 기다렸다가 표시된 편집 텍스트에서 키보드 액세스를 요청하려고했는지 확인합니다.

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



 void requestFocus(View editText, Activity activity)
{
    try {
        editText.requestFocus();
        InputMethodManager imm = (InputMethodManager) a.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
        activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
    } catch (Exception e) {
        e.printStackTrace();
    }

}

잊지 말고이 줄을 추가하십시오.

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



액티비티의 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;
  }



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



믿거 나 말거나, 활동 키보드로 소프트 키보드를 사용할 수 없다는 것을 발견했을 때 소프트 키보드 문제가 해결되었습니다. 인 텐트를

i.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);

overridePendingTransition(0, 0);

그것은 소프트 키보드를 숨길 수 있고 그것을 보여줄 방법이 없습니다.




나는 아래의 코드로 몇 가지 간단한 경우에 약간의 행운을 가져왔다. 나는 모든 테스트를 끝내지 않았지만 ....

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



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



매니페스트 파일에 android : windowSoftInputMode = "stateHidden"을 추가하십시오 ...




그것은 나를 위해 일했습니다. 이것을 사용해 키보드를 볼 수도 있습니다 :

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



조각을 위해, 확실히 작동 :

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



위에서 주어진 모든 솔루션 ( OnText에 첨부 된 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 텍스트에 포커스가있는 경우 키보드 표시"




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

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

키보드 표시 :

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



코드 스 니펫. . .

public void hideKeyboard(Context activityContext){

    InputMethodManager imm = (InputMethodManager)
            activityContext.getSystemService(Context.INPUT_METHOD_SERVICE);

    //android.R.id.content ( http://.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);
        }
    });
}



나는 이상한 행동을 발견했다. 왜냐하면 내 앱 중 하나에서 소프트 키보드가 자동으로 액티비티에 들어가는 것을 보여주기 때문이다 (onCreate에 editText.requestFocus ()가있다).

더 자세히 조사하자면 레이아웃 주위에 ScrollView가 있기 때문에 이것이 발견되었습니다. ScrollView를 제거하면 원래 문제 문에 설명 된대로 동작합니다. 이미 포커스가있는 editText를 클릭 할 때만 소프트 키보드가 표시됩니다.

작동하지 않는다면 ScrollView를 삽입하십시오. 어쨌든 무해합니다.




showSoftInput 은 전혀 작동하지 않았습니다.

나는 입력 모드를 설정할 필요가 있다고 생각했다. (여기서는 매니페스트의 Activity 구성 요소에서)

android:windowSoftInputMode="stateVisible" 



android의 매우 일반적인 문제
그것은 3 개의 조각으로 분해 될 수있다.
1) 활동 B 시작 (활동 A에서 발생)
2) 요청 된 데이터 설정 (활동 B에서 발생)
3) 요청 된 데이터 수신 (활동 A에서 발생)

1) startActivity B

Intent i = new Intent(A.this, B.class);
startActivity(i);

2) 요청 된 데이터 설정

이 부분에서는 특정 이벤트가 발생할 때 데이터를 되돌릴 지 여부를 결정합니다.
예 : 활동 B에는 EditText와 두 개의 버튼 b1, b2가 있습니다.
버튼 b1을 클릭하면 데이터가 활동 A로 다시 전송됩니다.
버튼 b2를 클릭해도 데이터가 전송되지 않습니다.

데이터 전송 중

b1......clickListener
{
   Intent resultIntent = new Intent();
   resultIntent.putExtra("Your_key","Your_value");
   setResult(RES_CODE_A,resultIntent);
   finish();
}

데이터를 보내지 않음

b2......clickListener
    {
       setResult(RES_CODE_B,new Intent());
       finish();
    }

사용자가 뒤로 버튼을 클릭합니다.
기본적으로 결과는 Activity.RESULT_CANCEL 응답 코드로 설정됩니다.

3) 검색 결과

해당 override onActivityResult 메서드

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if (resultCode == RES_CODE_A) {

     // b1 was clicked 
   String x = data.getStringExtra("RES_CODE_A");

}
else if(resultCode == RES_CODE_B){

   // b2 was clicked

}
else{
   // back button clicked 
}
}






android keyboard focus android-edittext android-softkeyboard