자동 플로피 키보드 팝업

1950 단어
개발 과정에서 테스트 요구에 부딪히면 EditText 입력 인터페이스에 들어갈 때 이 EditText는 자동으로 초점을 얻고 입력법 소프트 키보드를 팝업합니다.혼자서 오랫동안 모색했고 인터넷에서도 많은 코드를 찾았으며 코드에 setFocusable(true)를 설정했다.setFocusableInTouchMode(true);requestFocus();Fragment 또는 사용자 정의 컨트롤에서 효과가 없는 경우가 많습니다.다음은 인터페이스에 들어갈 때 강제로 팝업하고 onResume 방법에서 호출하는 두 가지 실행 가능한 방법입니다. 다음은 코드입니다.
public static void showKeyBoard(final View v) {
        v.requestFocus();
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                InputMethodManager manager = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
                manager.showSoftInput(v, InputMethodManager.SHOW_FORCED);
            }
        }, 100);
    }

그러나 이 방법은 너무 폭력적이어서 사용 과정에서 많은 문제를 일으킨다. 예를 들어 HOME 키를 누르면 데스크톱으로 돌아갈 때 소프트 키보드가 사라지지 않기 때문에 onPause에서 소프트 키보드를 강제로 숨겨야 한다.
public static void hideKeyBoard(final View v) {
        InputMethodManager manager = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        if (manager.isActive()) {
            manager.hideSoftInputFromWindow(v.getWindowToken(), 0);
        }
    }

나중에 동료의 말에 의하면 아날로그 클릭 방법을 사용할 수 있다는 것을 발견했다. 코드는 다음과 같다.
private void analogClick(View v) {
        Log.d(TAG, "-----> analog");
        Rect rect = new Rect();
        v.getGlobalVisibleRect(rect);
        v.requestFocus();

        long uptimeMillis = SystemClock.uptimeMillis();
        MotionEvent obtain = MotionEvent.obtain(uptimeMillis, uptimeMillis, 0, (float)v.getWidth(), (float) v.getHeight(), 0);
        MotionEvent obtain1 = MotionEvent.obtain(uptimeMillis, uptimeMillis, 1, (float)v.getWidth(), (float) v.getHeight(), 0);

        editUserName.onTouchEvent(obtain);
        editUserName.onTouchEvent(obtain1);
    }

이 방법은view 그리기가 끝난 후에야 적용됩니다. 시간 지연을 설정하는 것을 권장합니다.

좋은 웹페이지 즐겨찾기