2017-10-03 21 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

まず、新しいダイアログのタイトルを発表することは非常に標準的です。それ以外の場合は、アクセシビリティの面で生産性が低下する可能性があります。これは、障害のあるユーザーのニーズを本当に理解していない、良いことを動機付けた人からのアクセシビリティ要件のようなものです。フォーカスを任意に回すことは通常悪いことです。オペレーティングシステムがフォーカスを持って望んだことをやり遂げるようにするのは、Assistive Technology(TalkBack)ユーザーが慣れ親しんだものです。

これは、コードに2つの大きな問題があると言います。まず、フォーカスを言うとき、アクセシビリティの焦点を意味します。

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

これらのラインの全ては、キーボード、または入力フォーカス、TextViewに特に有意義であるのどれを参照しています。これらは、ButtonsEditTextボックスのようなアクティブな要素に対してのみ意味があります。あなたはそれを正しく行うなら、これはうまくいくのですか?しかし、それはキーボードのユーザーにとっては厄介なTab orderingにTextViewが追加されているような厄介な副作用があります.TextViewにはフォーカスのハイライトがないため、フォーカスナビゲーションが消えるからです。あなたが本当に欲しいのは次のイベントタイプです:

AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED 

今、2番目のポイントです。ビューが実際にレンダリングされる前に、これをすべて実行しています。

tvMsg.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED); 

は、上記の他の行を削​​除し、あなたは黄金のようになります。この行では

tvMsg.requestFocus(); 

:この行を置き換えます。しかし、私の最終的な勧告は、これをすべて削除し、これらの3つの行を完全に削除し、これを忘れることになります。オペレーティングシステムにそのことをさせてください!

+0

私は上記の指示に従っていますが、それでも私は同じ問題を抱えています。 –

+0

競合状態になっている可能性があります。ビューがレンダリングされていることを確認してから、ViewAccessibilityEventラインを送信してください。そうでない場合、ビューがレンダリングされるのを確実にする正しいコールバックを見つけるために、遅延が必要です。 – ChrisCM

+0

私は、Thread.sleepを使ってビューをレンダリングするのに数秒待ってから 'tvMsg.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);コードのみを適用しました。しかし、まだそれは動作していません。 –

関連する問題