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

如何防止android对讲说话搜索栏进度

慎弘化
2023-03-14

我有一个扩展SeekBar的自定义控件,其中我覆盖了onLaunalizeAccessibilityNodeInfo,如下所示:

@Override
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
    super.onInitializeAccessibilityNodeInfo(info);
    info.setClassName(TextView.class.getName());
}

然后我对这个控件设置内容描述为“我的控件”,但是当可访问性焦点来到这个控件时,talkback仍然说出“我的控件,%x percent”。我不希望它说进展,即“百分之x”。相反,我想覆盖对讲文本,而不是它宣布“x百分之……”它会显示我设置的自定义文本,例如“选定的x值”。怎么做?

共有3个答案

丁恩
2023-03-14

对我来说,在API级别工作

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    // prevent "zero percent" talkback; null or empty string does not work
    pbProgress.setStateDescription("\u2800");
}

Null将状态描述重置为其默认行为。空字符串或空格似乎被忽略了。

茹康裕
2023-03-14

多亏了@nick-peppers回答 https://stackoverflow.com/a/58434362/2713403 我开始更好地了解AccessibilityDelegate的工作原理,所以我做了一个不同的解决方案,因为我想选择搜索栏。通过从OnInitializeAccessibilityEvent方法中删除超级调用,如果用户单击,则无法将选择保留在搜索栏上,因此我进行了此操作(在Android 11,10和9上进行了测试)

...
seekbar.setAccessibilityDelegate(new customSeekBarDelegate());
...

/**
 * Create a custom delegate to modify what Talkback is going to read out loud
 */
private class customSeekBarDelegate extends View.AccessibilityDelegate
{
    /**
     * If the selected view is the slider, populate the text to read by talkback.
     * On Android 10 and 9, the view got selected from the beginning without touch the slider,
     * so the TYPE_VIEW_SELECTED event is controlled.
     * The text should be overwritten to trigger what Talkback do need to read.
     *
     * @param host The view selected
     * @param event The event to initialise
     */
    @Override public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event)
    {
        super.onInitializeAccessibilityEvent(host, event);
        if (event.getEventType() != AccessibilityEvent.TYPE_VIEW_SELECTED)
        {
            seekbarText.setText(seekbarText.getText());
        }
    }

    /**
     * Send all accessibility events except the focused accessibility event
     * because it reads the percentage, so it needs to be changed to no focused to read
     * the sliderText.
     *
     * @param host the view selected
     * @param eventType The accessibility event to send
     */
    @Override public void sendAccessibilityEvent(View host, int eventType)
    {
        if (eventType == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED)
        {
            eventType = AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED;
        }

        super.sendAccessibilityEvent(host, eventType);
    }

    /**
     * If the slider changes, it won't send the AccessibilityEvent TYPE_WINDOW_CONTENT_CHANGED
     * because it reads the percentages, so in that way it will read the sliderText.
     * On Android 10 and 9, the view got selected when it changes, so the TYPE_VIEW_SELECTED
     * event is controlled.
     *
     * @param host the view selected
     * @param event the accessibility event to send
     */
    @Override public void sendAccessibilityEventUnchecked(View host, AccessibilityEvent event)
    {
        if (event.getEventType() != AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED
            && event.getEventType() != AccessibilityEvent.TYPE_VIEW_SELECTED)
        {
            super.sendAccessibilityEventUnchecked(host, event);
        }
    }
}

这样的话,我就可以选择seekbar,然后大声朗读,不带百分比。不要忘记附上活动搜索栏。OnSeekBarChangeListener到seekbar,以便在seekbar文本发生变化时更新它。

颜实
2023-03-14

我在C#的Xamarin.Android中做了类似的事情,但代码应该足够容易移植回Java。此外,请记住,当控件突出显示时,这些更改将覆盖初始对讲。

首先在跟踪值集的text View上:

textView.AccessibilityLiveRegion = AndroidViews.AccessibilityLiveRegion.Assertive;

然后,我必须创建自己的自定义< code > AccessibilityDelegate :

public class CustomSeekbarDelegate : Android.Views.View.AccessibilityDelegate
{
    public override void OnInitializeAccessibilityEvent(AndroidViews.View host, AccessibilityEvent e)
    {
        //NOTE: Don't call base to prevent seekbar talkback percentage
    }
}

seekBar.SetAccessibilityDelegate(new CustomSeekbarDelegate());

可能有一种方法可以在第一次突出显示时保持初始语音控制的可访问性,但网上没有太多关于它的信息,这足以满足我们的需求。此外,我没有额外的时间来尝试让它也正常工作。

 类似资料:
  • 我想设计一个寻找栏,看起来像下图中的那个。 通过使用默认搜索栏,我将得到这样的东西: 所以我只需要改变颜色。我不需要额外的款式。有没有什么直接的方法可以做到这一点,或者我应该建立我的自定义绘图。? 我试图建立自定义的一个,但我不能得到确切的一个如上所示。使用自定义drawable后,我得到的结果如下所示: 如果我需要建立一个自定义的,那么请建议如何减少进度线的宽度和形状。 我的自定义实现: bac

  • 苹果风格的搜索栏,带有一个自动隐藏的取消按钮。适合作为主搜索固定在页面顶部,搜索栏只是一个CSS组件,不提供任何JS功能,你也可以单独使用 .search-input。 <header class="bar bar-nav">   <h1 class='title'>搜索栏</h1> </header> <div class="bar bar-header-secondary">   <d

  • 搜索栏允许用户在列表元素中搜索,或者它可以用来作为UI组件,放到你自己的搜索实现中。 搜索栏布局 搜索栏应该放到“.page”内,“.page-content”前: <div class="page"> <!-- Search bar --> <form class="searchbar"> <div class="searchbar-input"> <inpu

  • <div class="ui-searchbar-wrap ui-border-b"> <div class="ui-searchbar ui-border-radius"> <i class="ui-icon-search"></i> <div class="ui-searchbar-text">搜索号码(2-10位)</div>

  • search这部分是利用小程序input组件实现,在下面的示例中主要使用了focus和bindinput两个属性,由于mpvue从底层支持 Vue.js 语法和构建工具体系,因此可以用vue的v-model进行双向数据绑定,示例如下: <template> <div class="page"> <div class="page__hd"> <div class="page_

  • 我正在实现一个kiosk模式应用程序,我已经成功地使应用程序全屏显示,在4.3之后没有状态栏出现,但在4.3和4.4中无法隐藏状态栏,因为当我们在屏幕顶部向下滑动时,状态栏会出现。 我已经试着在 在清单中指定全屏主题 设置窗口标志ie setFlags setSystemUi可视性 可能重复,但未找到具体解决方案 永久隐藏Android状态栏 最后的事情我想要的是,如何隐藏状态栏永久在一个活动??