3

私は現在PagerTabStrip、より多くのTalkBack発声で作成するのに苦労しています. コンテキストは次のとおりです。

  • 左右のタブに「タブ [タブ名] 未選択、2回クリックで選択」、中央のタブに「タブ [タブ名] 選択済み」をTalkBackユーザー用に追加したい。
  • また、タブがクリックされたときに発声を追加して、コンテンツが変更されたことをユーザーに警告しTalkBack、中央のタブにフォーカスするように指示したいと考えています。

必要なすべてのクラス (たとえばPagerTitleStrip、 、ViewPager、 ) を書き直し、タブに直接FragmentPagerAdapter権限を追加することで、部分的に成功しました。かなりうまく機能しますが、満足していません。これらのクラスのメンテナンスは、Android メイン クラスの新しいバージョンごとに更新する必要があり (または古いデザインを維持します)、毎回すべてのクラス コンテンツをコピー ペーストするのが面倒だと思います (次の開発者はどうしますか?)。だから、私は別のアプローチを試しました:contentDescriptionTextView

  • AccessibilityEventのサブクラスで使用して、PagerTabStrip発声により多くのコンテキストを与えます。のメソッドが発声に使用されていないためgetText()、機能しませんでした。getContentDescriptionAccessibilityEvent
  • AccessibilityNodeInfoから作業してViewPager、解決できるかどうかを確認してください。しかし、発声のソース (タブかコンテンツか) も、AccessiblityNodeInfo発声を変更するために何を変更する必要があるかも特定していません。

だから、私の問題を解決するためにサブクラスを使用することが可能かどうか、またはメインクラスをコピーするしかないのだろうか. よろしくお願いします。

4

2 に答える 2

2

これは実際には非常に簡単です。あなたがしたいことは、PagerTabStrip のサブクラスを作成することです。このサブクラスでは、アクセシビリティ イベントの伝播を拡張して、必要な情報を追加します。以下は私の実装です。

public class A11yPagerTabStrip extends PagerTabStrip {

    public A11yPagerTabStrip(Context context) {
        super(context);
    }

    public A11yPagerTabStrip(Context context, AttributeSet attrs) {
        super(context, attrs);
    }


    @Override
    public boolean onRequestSendAccessibilityEvent(View child, AccessibilityEvent event) {
        Log.wtf(LOG_TAG, "onRequestSendAccessibilityEvent: " + event.toString());

        final String textViewTitle = ((TextView) child).getText().toString();
        final ViewPager viewPager = (ViewPager) this.getParent();
        final int itemIndex = viewPager.getCurrentItem();

        String title = viewPager.getAdapter().getPageTitle(itemIndex).toString();

        if (textViewTitle.equalsIgnoreCase(title)) {
            child.setContentDescription("Tab " + textViewTitle + "selected.");
        } else {
            child.setContentDescription("Tab " + textViewTitle + "not selected.");
        }

        return super.onRequestSendAccessibilityEvent(child, event);
    }

}

コンテンツの説明を上書きしていることに注意してください。このようにして、アプリケーションの視覚的表現を変更せず、トークバックが読み取るものだけを変更します。

注: Talkback ユーザーは、「ダブルタップして選択」部分に慣れています。コードで行ったように、これはオフのままにします。

于 2015-02-12T19:37:50.360 に答える
1

タブ自体については、View のインフレートを担当している場合は、アクティブ化された (または選択された) 状態に基づいてコンテンツの説明を変更するカスタム TextView を使用できます。

public class TabTextView extends TextView {

    public TabTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public CharSequence getContentDescription() {
        CharSequence contentDescription = super.getContentDescription();
        return isActivated() ? appendSelectedTo(contentDescription) : contentDescription;
    }

    private String appendSelectedTo(CharSequence contentDescription) {
        return getResources().getString(R.string.tab_selected, contentDescription);
    }
}

どこR.string.tab_selectedですか<string name="tab_selected">%1$s selected</string>

これは、あなた(またはあなたが使用しているライブラリsetActivated(true)/setSelected(true))がタブビューを選択したときに(および他のすべてのタブを)マークしていることを前提としていますsetActivated(false)/setSelected(false)


コンテンツが変更されたことをユーザーに通知する最も簡単な方法はViewPager.OnPageChangeListener、ページが変更されたときに通知する を追加することです。

viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {

    @Override
    public void onPageSelected(int position) {
        // TODO: format correctly with String resource to support translation
        viewPager.announceForAccessibility("Showing " + viewPager.getAdapter().getPageTitle(position));
    }

});

Android TalkBack ユーザーは、何がクリック可能かを示していない動作に慣れていることを知っています

@ChrisCM が述べたように、クリック可能な要素には (デフォルトで) 表示がありますView.OnClickListener

onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info)メソッドをオーバーライドすることで、アクセシビリティ デリゲートを使用して TalkBack が読み上げるアクションを変更できます。

class TabAccessibilityDelegate extends AccessibilityDelegateCompat {

    @Override
    public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {
        super.onInitializeAccessibilityNodeInfo(host, info);
        info.addAction(
                new AccessibilityNodeInfoCompat.AccessibilityActionCompat(
                        AccessibilityNodeInfoCompat.ACTION_CLICK,
                        "select tab"
                )
        );
    }

}

そして、各タブビューに設定します:

ViewCompat.setAccessibilityDelegate(tabView, new TabAccessibilityDelegate());

これで TalkBack は次のように読み上げます: "<tab content description>... double tap to select tab".

使用上のヒントをカスタマイズするその他の方法については、この回答を参照してください。

于 2017-01-08T08:24:55.230 に答える