2015-01-09 4 views
2

현재 진행중인 풀 스크린 OpenGL 기반 프로젝트에서 필자는 GL 기반 그래픽 요소, 특히 텍스트 입력 필드를 사용합니다. 이 요소에 포커스가있을 때 텍스트를 입력하기 위해 소프트 키보드를 표시합니다 (괜찮아 보입니다).Android Lollipop 소프트 키보드가 GL 표면의 키 누르기를 허용하지 않습니다.

5.0 이전의 Android 버전에서 Google 키보드는 정상적으로 작동하여 하드웨어 키보드와 같은 주요 이벤트를 보냈습니다. android Lollipop에서 Swiftkey 또는 무료 해커 키보드와 같은 일부 키보드는 계속 작동하지만 Google 키보드는 더 이상 사용하지 않습니다.

Lollipop에서 Google 키보드의 키를 누르면 시각적 피드백이 키보드 자체에 나타나지 않고 내 애플리케이션은 키보드가 보이지 않는 것처럼 터치 이벤트를 수신합니다. '하드웨어'백 키는 제대로 작동합니다.

응용 프로그램에서 사용되는보기는 SurfaceView이며 TextView가 아닙니다. 나는 onCheckIsTextEditor을 오버라이드했고, 을 TYPE_NULL으로 설정 한 onCreateInputConnection에서 특정 InputConnection을 반환합니다. onCreateInputConnection이 호출되지 않은 것 같습니다.

이 응용 프로그램은 android level 15와 호환됩니다.

키보드가 터치 이벤트를 수락하지 못하게하는 원인은 무엇입니까? 터치 이벤트 흐름을 디버깅하려면 어떻게해야합니까?

답변

1

나는 그것이 실제로 작동하는 이유를 정확하게 이해하지는 않지만 마침내 내 문제에 대한 해결 방법을 발견했습니다. 이 솔루션은 부분적으로 Cocos2d-x가 Android에서 입력하는 것을 기반으로합니다.

내가 안드로이드 EditText 생성 (내가 onKeyUponKeyDown를 오버라이드하는 EditText을 상속보다 실제로 클래스를,이 초점과 다시 키를 추적하는 것입니다).

private FrameLayout setupView(View androidView) 
{ 
    ViewGroup.LayoutParams framelayout_params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,                                     ViewGroup.LayoutParams.MATCH_PARENT); 
    frameLayout = new FrameLayout(this); 
    getFrameLayout().setLayoutParams(framelayout_params); 

    ViewGroup.LayoutParams edittext_layout_params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,                               ViewGroup.LayoutParams.WRAP_CONTENT); 

    edittext = new FakeEditText(this); 
    edittext.setLayoutParams(edittext_layout_params); 

    // make sure this edit text is not fullscreen 
    edittext.setImeOptions(EditorInfo.IME_FLAG_NO_FULLSCREEN | EditorInfo.IME_FLAG_NO_EXTRACT_UI); 

    // ...add to FrameLayout 
    frameLayout.addView(edittext); 
    frameLayout.addView(androidView); 
    return frameLayout; 
} 

대신 활동의 SurfaceView 유일한 요소를 갖는

, 나는 가짜 편집 백그라운드에서 텍스트 (그러나 전체 화면되지 않음)이있는 레이아웃, 상단에 SurfaceView을 생성 또한 가짜 편집 텍스트에 연결된 TextWatcher을 추가했습니다.이 텍스트는 주로 사용자가 입력 한 텍스트를 캡처하고 SurfaceView에있는 GL 기반의 편집 텍스트로 보내집니다 (내 경우에는 afterTextChanged 메서드가 호출 될 때, 수신 된 문자를 내 GL 컨트롤로 라우팅되는 내부 keydown/keyup 이벤트로 변환합니다.

예를 들어 GL 텍스트 필드에 포커스가있는 경우 가상 키보드를 표시해야 할 때 위젯 편집 텍스트에 TextWatcher을 첨부하고 붙여 넣습니다. 안드로이드 가짜 텍스트 편집 가상 키보드.

// Control is the base class of my GL controls 
private void uiShowVirtualKeyboard(Control control) 
{ 
    if (fakeEdit.requestFocus()) { 
    // textWrapper is our TextWatcher 
    fakeEdit.removeTextChangedListener(textWrapper); 
    fakeEdit.setText(""); 

    // get the text from the GL Text entry 
    final String text = control.getTextContent(); 

    // and make sure it's in the android EditText at start 
    fakeEdit.append(text); 

    // listen to user changes 
    fakeEdit.addTextChangedListener(textWrapper); 

    // show the virtual keyboard 
    InputMethodManager imm = (InputMethodManager) fAndroidActivity.getSystemService(Context.INPUT_METHOD_SERVICE); 
    imm.showSoftInput(fakeEdit, InputMethodManager.SHOW_FORCED); 
    } 
} 
0

정확히 같은 문제가있었습니다. Google 키보드가 올바르게 표시되지 않고 버튼을 통해 터치 입력이 전달되었습니다.

Google 키보드는 EditorInfo 클래스의 기본 설정이 onCreateInputConnection으로 전달되어보기에 만족스럽지 않습니다. 최소 imeOptions 필드를 채우고 나머지는 기본값으로두면 함수에서 null을 반환하더라도 작동합니다.

@Override 
public InputConnection onCreateInputConnection(EditorInfo outAttrs) { 
    outAttrs.inputType = InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS | InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE | InputType.TYPE_CLASS_TEXT; 
    outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_EXTRACT_UI | EditorInfo.IME_FLAG_NO_FULLSCREEN; 
    return super.onCreateInputConnection(outAttrs); 
} 
:

은 문제를 해결하기 위해 난 내 SurfaceView 서브 클래스에이 라인을 추가했습니다

관련 문제