Android 辅助功能 - 无法专注于 Appbar 中的任何元素

Apo*_*rva 8 android navigation-drawer android-collapsingtoolbarlayout android-appbarlayout android-accessibility

我在我的 2 个活动中遇到了这个问题。当我使用键盘 Tab 键或箭头键导航时 - 我无法到达应用栏中的任何元素。

1) 活动 1 -> 我的 appbar 有一个汉堡菜单图标来访问 NavigationView。我无法单击此图标。如果我触摸菜单图标 - 我可以使用键盘在菜单项上下导航。但是我如何进入菜单?

2) 活动 2 - 我有一个 CoordinatorLayout,里面有一个 CollapsingToolbarLayout 和一个 NestedScrollView。我能够导航到 NestedScrollView 的所有元素。但是我无法到达 CollapsingToolbarLayout 内工具栏上的任何按钮。它有一个收藏夹按钮和一个选项菜单 - 溢出图标和我总是在应用栏上显示的 1。我如何到达这些图标?

这是活动2的布局

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/root_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.design.widget.AppBarLayout
            android:id="@+id/detail_app_bar_layout"
            android:layout_width="match_parent"
            android:layout_height="@dimen/place_detail_appbar_height"
            android:elevation="@dimen/place_detail_appbarlayout_elevation">
            <android.support.design.widget.CollapsingToolbarLayout
                android:id="@+id/detail_collapsing_toolbar_layout"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@color/colorPrimary"
                android:transitionGroup="false"
                app:collapsedTitleGravity="start"
                app:collapsedTitleTextAppearance="@style/TextAppearance.AppCompat.Widget.ActionBar.Title.Inverse"
                app:contentScrim="?attr/colorPrimary"
                app:expandedTitleMarginStart="72dp"
                app:layout_scrollFlags="scroll|exitUntilCollapsed">

                <ImageView
                    android:id="@+id/detail_app_bar_photo"
                    android:layout_height="match_parent"
                    android:layout_gravity="center"
                    android:scaleType="centerCrop"
                    app:layout_collapseMode="parallax"
                    android:background="@color/colorPrimary"
                    android:contentDescription="@string/place_image"
                    android:transitionName="@string/shared_photo"
                    style="@style/ToolbarImage"/>

                <android.support.v7.widget.Toolbar
                    android:id="@+id/detail_toolbar"
                    android:layout_width="match_parent"
                    android:layout_height="@dimen/place_detail_toolbar_height"
                    android:background="@color/colorAccent"
                    app:layout_collapseMode="pin"
                    android:layout_gravity="bottom"
                    android:theme="@style/AppTheme.ToolbarColored">

                    <LinearLayout
                        android:id="@+id/meta_bar"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_gravity="start"
                        android:background="@android:color/transparent"
                        android:orientation="horizontal">

                        <TextView
                            android:id="@+id/toolbar_place_name"
                            style="@style/ToolbarName"
                            android:layout_width="0dp"
                            android:layout_height="wrap_content"
                            android:layout_weight="4"
                            android:layout_gravity="center_vertical|start"
                            tools:text="OFJCC Gym and Recreation Center" />
                        <ImageView
                            android:id="@+id/toolbar_fav_icon"
                            android:layout_width="0dp"
                            android:layout_height="wrap_content"
                            android:layout_weight="1"
                            app:srcCompat="@drawable/ic_favourite_border"
                            android:tag="favorite_border"
                            android:layout_gravity="center"
                            android:focusable="true"
                            android:contentDescription="@string/favorite_desc"/>

                    </LinearLayout>

                </android.support.v7.widget.Toolbar>

            </android.support.design.widget.CollapsingToolbarLayout>

        </android.support.design.widget.AppBarLayout>

        <android.support.v4.widget.NestedScrollView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:nextFocusUp="@+id/toolbar_fav_icon"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">

            <include layout="@layout/place_details_content"/>

        </android.support.v4.widget.NestedScrollView>

    </android.support.design.widget.CoordinatorLayout>

</FrameLayout>
Run Code Online (Sandbox Code Playgroud)

我无法访问 toolbar_fav_icon ImageView

这两种情况之间唯一的共同点是在这两种情况下 - 我在访问 Appbar 上的元素时遇到问题。我是一个新手,我可能遗漏了一些非常明显的东西。请多多包涵,帮帮我!

谢谢!

阿普尔瓦

whe*_*max 10

当我在我们的应用程序中研究辅助功能时,我发现我无法通过蓝牙键盘将焦点移动到操作栏/工具栏视图。

我的测试设备是三星,所以我认为这是带有导航集群的东西,如这里的一些答案中所述......

但

就我而言,解决方案是 - 只需将此行添加到您的appBar和/或工具栏

android:touchscreenBlocksFocus="false"
Run Code Online (Sandbox Code Playgroud)


abh*_*zag 7

您是否尝试按下组合键 Cmd+Tab(在 Mac 上)或 Ctrl+Tab(在 Windows 上)?

Android 引入了键盘导航集群的新概念,并将 Toolbar 标记为 API 26+ 的导航集群。因此,仅通过 Tab 键无法访问工具栏元素,您需要“元选项卡”(Ctrl/Cmd + Tab)才能访问 API 26 及更高版本设备的工具栏。


Ita*_*man 3

在实现可访问性时,几乎总会有一些以元素为焦点的来回游戏,直到您掌握它为止。

现在,对于您的问题,如果仍然相关并且对于未来的寻求者来说不相关的话-

在使用可访问性时,请确保您想要获得焦点的每个元素都具有 importantforaccessibility 属性

android:importantForAccessibility="yes"
Run Code Online (Sandbox Code Playgroud)

另外,在您的情况下,如果我理解正确,您不需要 TalkBack 的辅助功能焦点,而是使用键盘导航。因此,基本上只需确保您希望能够获得焦点的每个元素都设置为 focusable true 即可。

android:focusable="true" 
Run Code Online (Sandbox Code Playgroud)

这些是使用焦点的基础知识。

加分项——

如果您想以编程方式使某些内容在加载或有人被点击时获得焦点,您可以使用以下代码 -

myCustomView.post(new Runnable() {
        @Override
        public void run() {
            myCustomView.requestFocus();
            myCustomView.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
        }
    });
Run Code Online (Sandbox Code Playgroud)

这不一定是在后期功能中,但如果不是在某些情况下,它就会落在线条之间并且不会获得焦点。