2017-10-03 1 views
1

아래 코드를 사용하여 잘못된 사용자 이름이나 암호를 입력하는 동안 대화 상자를 표시하려고했습니다.Android 대화방에서 대화 상자의 내용을 읽지 못했습니다.

private void showAlert(String title, String msg) { 
    customDialog = new Dialog(LoginActivity.this, 
      android.R.style.Theme_Dialog); 
    customDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    customDialog.setContentView(R.layout.custom_alert_dialog); 

    tvTitle = (TextView) customDialog 
      .findViewById(R.id.dialog_title); 
    tvMsg = (TextView) customDialog 
      .findViewById(R.id.dialog_message); 
    btnNeutral = (Button) customDialog 
      .findViewById(R.id.closeAlert); 

    tvMsg.setText(msg); 
    tvTitle.setText(title); 

    tvMsg.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED); 
    tvMsg.setFocusable(true); 

    btnNeutral.setText("Close"); 
    btnNeutral.setVisibility(View.VISIBLE); 
    btnNeutral.setOnClickListener(new OnClickListener() { 

     public void onClick(View v) { 
      customDialog.dismiss(); 
     } 
    }); 
    customDialog.show(); 
    tvMsg.requestFocus(); 
} 

코드가 잘 작동하지만 내 관심사는 안드로이드 토크백을 사용할 때입니다. 대화 상자의 제목 만 읽습니다. 토크백은 제목 대신 대화 상자의 내용 (메시지)을 읽어야합니다. 아무도 나를 도울 수 있습니까?

답변

0

첫 번째로, 새로운 대화 상자의 제목을 발표하는 것은 매우 표준입니다. 그렇지 않으면 접근성 측면에서 역효과를 낼 수 있습니다. 이것은 나에게 장애가있는 사용자의 요구를 실제로 이해하지 못하는 것 같은 좋은 일을하도록 동기를 부여받은 사람의 접근성 요구 사항처럼 들립니다. 임의적으로 초점을 맞추는 것은 일반적으로 좋지 않습니다. 운영 체제가 포커스를 가지고 원하는대로 행동하게하십시오. 이것은 보조 기술 (TalkBack) 사용자가 익숙한 것입니다.

이렇게하면 코드에 두 가지 중요한 문제가 있다고합니다. 먼저 초점을 말할 때 접근성에 중점을 둡니다.

tvMsg.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED); 
tvMsg.setFocusable(true); 
tvMsg.requestFocus(); 

이 라인의 모든

TextView 특히 의미가 없음있는 키보드 또는 입력 포커스를 참조하면된다. 이는 ButtonsEditText 상자와 같은 활성 요소에 대해서만 의미가 있습니다. 올바르게 작동한다면이 방법이 효과가 있습니까? 그러나 TextViews에는 포커스 하이라이트가 없기 때문에 포커스 순서 탐색이 사라 지므로 TextView이 Tab 주문에 추가되는 것과 같은 부작용이 키보드 전용 사용자에게는 어색합니다. 정말로 원하는 이벤트 유형은 다음과 같습니다.

AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED 

이제 두 번째 지점입니다. 뷰가 실제로 렌더링되기 전에이 모든 작업을 수행하고 있습니다.

tvMsg.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED); 

는 위에서 언급 한 다른 라인을 삭제하고 당신은 황금해야한다 :이 라인으로

tvMsg.requestFocus(); 

:이 줄을 교체합니다. 다시 말하지만, 나의 궁극적 인 권고는이 모든 것을 버리고 그 세 줄을 완전히 제거하고 잊어 버릴뿐입니다. 운영 체제가 그 일을하게하십시오!

+0

위의 지침을 따라했지만 여전히 동일한 문제가 있습니다. –

+0

경쟁 조건이있을 수 있습니다. ViewAccessibilityEvent 행을 보내기 전에보기가 렌더링되고보기 계층 구조에 있는지 확인하십시오. 그렇지 않은 경우 뷰가 렌더링되도록 올바른 콜백을 찾으려면 지연이 필요합니다. – ChrisCM

+0

Thread.sleep을 사용하여 뷰 렌더링에 몇 초 동안 기다렸다가'tvMsg.sendAccessibilityEvent (AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED); 코드 만 적용했습니다. 하지만 여전히 작동하지 않습니다. –

관련 문제