当前位置: 首页 > 知识库问答 >
问题:

第二次导航后,对讲系统不聚焦新片段

邢财
2023-03-14

我有一个用Android导航的app(单个活动很多片段)。< br >启动时,该应用程序会显示一个加载屏幕,这是一个可选的“新闻”类型的屏幕,当用户完成后会返回到主屏幕,然后是主屏幕。< br >但是,我无法访问主屏幕。当新闻屏幕不显示时,它会很好地聚焦,但当它被包括在内时,主屏幕将不会获得焦点,它似乎仍然在加载屏幕上。

我已经能够在一个最小的例子中重现这一点,用屏幕“加载”、“A”和“B”。这里的应用行为是:

  • 在主片段上启动
  • 等待5秒,导航到片段A
  • 用户按“继续”
  • 返回主片段
  • 等待5秒,导航到片段B

每次导航后,我都希望文本元素被聚焦并读出。然而,对于片段B,它不是。

我尝试过的事情:

    < li >使用<代码>

如果我将加载片段更改为使用按钮进行导航,而不是自动行为,则焦点确实会正确传递,但显然不会提供正确的体验。

class LoadingFragment : Fragment() {

    private lateinit var rootView: View

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View = inflater.inflate(R.layout.fragment_main, container, false).also {
        rootView = it
    }

    private var beenHereBefore = false

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        // Mimic a delayed loading process
        Handler(Looper.getMainLooper()).postDelayed({
            // Navigate to the correct screen, based on state
            findNavController().navigate(
                if (beenHereBefore) {
                    R.id.action_mainFragment_to_fragmentB
                } else {
                    beenHereBefore = true
                    R.id.action_mainFragment_to_fragmentA
                }
            )
        }, 5000)
    }
}

fragment_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ui.main.LoadingFragment">

    <TextView
        android:id="@+id/message"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="MainFragment"
        android:textColor="@color/black"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
class FragmentA : Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View = inflater.inflate(R.layout.fragment_a, container, false)

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        view.findViewById<Button>(R.id.button).setOnClickListener {
            findNavController().popBackStack()
        }
    }
}

fragment_a.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Fragment A"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="308dp"
        android:text="Continue"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView" />
</androidx.constraintlayout.widget.ConstraintLayout>
class FragmentB : Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View = inflater.inflate(R.layout.fragment_b, container, false)
}

fragment_b.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Fragment B"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

main_graph.xml

<?xml version="1.0" encoding="utf-8"?>
<navigation 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/main_graph"
    app:startDestination="@id/mainFragment">

    <fragment
        android:id="@+id/mainFragment"
        android:name="com.example.navigationtestapp.ui.main.LoadingFragment"
        android:label="fragment_main"
        tools:layout="@layout/fragment_main" >
        <action
            android:id="@+id/action_mainFragment_to_fragmentA"
            app:destination="@id/fragmentA" />
        <action
            android:id="@+id/action_mainFragment_to_fragmentB"
            app:destination="@id/fragmentB" />
    </fragment>
    <fragment
        android:id="@+id/fragmentA"
        android:name="com.example.navigationtestapp.ui.main.FragmentA"
        android:label="FragmentA" />
    <fragment
        android:id="@+id/fragmentB"
        android:name="com.example.navigationtestapp.ui.main.FragmentB"
        android:label="FragmentB" />
</navigation>

共有1个答案

陈翰林
2023-03-14

如果我是,您将尝试使用可访问性API而不是请求焦点来处理可访问性焦点。您已经提到焦点似乎由加载屏幕保持,因此这应该可以工作,因为a11y焦点将跟随它,但我会尝试使用sendAccessibilityEvent方法https://developer.android.com/reference/android/view/accessibility/AccessibilityEventSource#sendAccessibilityEvent(int)来处理它

// Moving a11y focus from btn1 to btn 2

        btn1 = (Button) findViewById(R.id.screen3_btn1);
        btn2 = (Button) findViewById(R.id.screen3_btn2);

        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                btn2.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
            }
        });

关于这个的优秀答案:Android-将TalkBack可访问性焦点设置为特定视图

希望这有帮助

 类似资料:
  • 我刚开始使用NativeScript,不知道如何导航页面/视图。不幸的是,vue路由器似乎仍然不受支持,所以我正在考虑使用手动路由。但是,我在app\components中有多个vue组件,不想按照示例所示的方式将它们全部放在一个vue中。 我有这个在我的第一个页面浏览量: 但当我点击按钮时,我得到一条信息: 我注意到错误引用所需的页面作为javascript: PageB. js甚至认为不存在。

  • 我已经创建了默认的Android Studio导航抽屉项目。默认情况下,我有一个活动和三个主要片段。(家庭,画廊,幻灯片),我只是尝试与家庭片段。我已经将 从content_main XML替换为 并将MainActivity修改为

  • 整合第三方系统: 该文档正在编写中...

  • 我有导航抽屉的BaseActivity,我在其中使用片段管理器在片段布局中显示/隐藏片段,当单击每个导航抽屉项时,我希望每次单击导航项时都刷新我的片段。我尝试了两种方法,例如片段附加/分离,但它不起作用,有谁能帮我在每次点击导航项时刷新我的片段吗。

  • 在本机应用程序中,当警报或对话框打开时,状态栏和系统导航栏变为透明,但在颤振系统中,导航栏保持白色。。请帮我实现这个目标。 在本机应用程序中: (https://i.stack.imgur.com/al54d.jpg) 在颤动中: (https://i.stack.imgur.com/E3PjM.jpg)

  • 我想使用箭头键关注下一个项。 在keydown事件处理程序中,我使用访问下一个项。 还有其他方法可以实现这一点吗? 在事件处理程序中,我想使用JQuery来实现这一点。这怎么做?