草庐IT

安卓辅助功能 : How do I change the text read out loud for an EditText View

coder 2023-12-04 原文

默认情况下,辅助功能服务将为 EditText View 读出以下内容

  • 如果 EditText 有输入的值 = 它会读出该值
  • 如果没有输入值=它会读出“提示”

我希望它在两种情况下读出完全不同的内容。

我的 xml fragment 是

<EditText
    android:id="@+id/my_edit_text"
    android:layout_height="wrap_content"
    android:layout_width="0dp"
    android:layout_weight="1"
    android:editable="false"
    android:focusable="true"
    android:hint="my hint text"/>

我必须支持 API 14 及更高版本。

我不想为这一个案例麻烦地扩展 EditText,因此我使用的是 AccessibilityDelegate。

mEditTextView.setAccessibilityDelegate(accessibilityDelegate);

从文档中我了解到,在我的委托(delegate)中,我只需要覆盖委托(delegate)中我想更改其行为的那些方法。所有其他方法将默认为 View 的实现。

http://developer.android.com/reference/android/view/View.AccessibilityDelegate.html http://developer.android.com/reference/android/view/View.html

“onPopulateAccessibilityEvent”的文档说:“让宿主视图有机会用其文本内容填充可访问性事件。” “dispatchPopulateAccessibilityEvent”的文档说:“首先将 AccessibilityEvent 分发给宿主视图,然后分发给它的 subview ,以便将它们的文本内容添加到事件中。”并且默认行为是调用“onPopulateAccessibilityEvent”对于 View 本身,然后在其所有子项上“dispatchPopulateAccessibilityEvent”

http://developer.android.com/guide/topics/ui/accessibility/apps.html

该文档在“onPopulateAccessibilityEvent”下说“*如果您对该事件的实现完全覆盖了输出文本,而不允许布局的其他部分修改其内容,则不要在您的代码中调用该方法的 super 实现。”

因此我的代表如下

View.AccessibilityDelegate accessibilityDelegate = new View.AccessibilityDelegate() {
    @Override
    public void onPopulateAccessibilityEvent(View v, AccessibilityEvent event) {
        event.getText().add("Apples");
    }

};

为什么当我使用键盘导航或使用屏幕点击 EditText View 时,它仍在读取“我的提示文本”而不​​是“Apples”?

如果我使用调试器,我会看到在我设置事件文本之前,文本是空的,在我设置之后,它是“Apples”,但 TalkBack 仍然读出提示。


奇怪的是,如果我覆盖“onInitializeAccessibilityNodeInfo”并发送一个带有我想要的文本的事件,那么这个想要的文本就会被读出(见下面的代码 fragment )。但这对我来说似乎是错误的,因为“onInitializeAccessibilityNodeInfo”正在对 EditText 的事件使用react,但随后只是引发了一个新事件。

@Override  
public void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfo info){  
    super.onInitializeAccessibilityNodeInfo(v, info);      
    ...   
    final AccessibilityEvent event = AccessibilityEvent.obtain(eventType);  
    event.getText().add("Pears");  
    event.setClassName(className);  
    event.setPackageName(packageName);  
    ...     
    v.getParent().requestSendAccessibilityEvent(v, event);  
}

最佳答案

我们可以通过执行以下操作来更改 EditText View 的朗读文本:

View.AccessibilityDelegate accessibilityDelegate = new View.AccessibilityDelegate() {
    @Override
    public void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfo info) {
        super.onInitializeAccessibilityNodeInfo(v, info);
        info.setText("some customized text")
    }  
};

然后将此委托(delegate)设置为 EditText View 。

关于安卓辅助功能 : How do I change the text read out loud for an EditText View,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25641081/

有关安卓辅助功能 : How do I change the text read out loud for an EditText View的更多相关文章

  1. ruby-on-rails - 如何使辅助方法在 Rails 集成测试中可用? - 2

    我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel

  2. ruby-on-rails - Cucumber 是否只是 rspec 的包装器以帮助将测试组织成功能? - 2

    只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您

  3. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  4. ruby-on-rails - Controller 中的 Rails 辅助模块 - 2

    我有一个Controller,我想为这个Controller创建一个助手,我可以在不包含它的情况下使用它。我尝试像这样创建一个与Controller同名的助手classCars::EnginesController我创建的助手是moduleCars::EnginesHelperdefcheck_fuellogger.debug("chekingfuel")endend我得到的错误是undefinedlocalvariableormethod`check_fuel'for#有没有我遗漏的约定? 最佳答案 如果你真的想在Controll

  5. ruby-on-rails - rails 功能测试 - 2

    在Rails自动生成的功能测试(test/functional/products_controller_test.rb)中,我看到以下代码:classProductsControllerTest我的问题是:方法调用products()在哪里/如何定义?products(:one)到底是什么意思?看代码,大概意思是“创建一个产品”,但是它是如何工作的呢?注意我是Ruby/Rails的新手,如果这些是微不足道的问题,我深表歉意。 最佳答案 如果您查看test/fixtures文件夹,您会看到一个products.yml文件。这是在您创建

  6. ruby-on-rails - 功能测试 Authlogic? - 2

    在我的一些Controller中,我有一个before_filter检查用户是否登录?用于CRUD操作。application.rbdeflogged_in?unlesscurrent_userredirect_toroot_pathendendprivatedefcurrent_user_sessionreturn@current_user_sessionifdefined?(@current_user_session)@current_user_session=UserSession.findenddefcurrent_userreturn@current_userifdefine

  7. ruby-on-rails - 为什么 Rails 使用像 link_to 这样的辅助方法而不是 <a href...>? - 2

    我正在学习Rails,我注意到Rails不断地使用诸如link_to之类的辅助方法,而不是仅仅使用普通的html。现在我可以理解为什么他们会使用他们会使用一些辅助方法,但我不明白为什么他们更喜欢辅助方法而不是直接编码html。为什么Rails更喜欢辅助方法而不是您必须手动编写html?为什么Rails团队做出这样的设计选择? 最佳答案 在Rails应用程序中,通常使用URL方法和内容方法生成链接,例如这绝对比将它们放入中更易于管理手动标记。">(您正在使用路由器生成这些URL,对吗?如果您硬编码/users/1并决定稍后将其设为/u

  8. ruby - Ruby 中允许 "p *1..10"打印出数字 1-10 的功能是什么? - 2

    require'pp'p*1..10这会打印出1-10。为什么这么简洁?您还可以用它做什么? 最佳答案 它是“splat”运算符。它可用于分解数组和范围并在赋值期间收集值。这里收集赋值中的值:a,*b=1,2,3,4=>a=1b=[2,3,4]在此示例中,内部数组([3,4])中的值被分解并收集到包含数组中:a=[1,2,*[3,4]]=>a=[1,2,3,4]您可以定义将参数收集到数组中的函数:deffoo(*args)pargsendfoo(1,2,"three",4)=>[1,2,"three",4]

  9. ruby - 现代计算机的功能是否不足以处理字符串而无需使用符号(在 Ruby 中) - 2

    我读过的关于Ruby符号的每一篇文章都在谈论符号相对于字符串的效率。但是,这不是1970年代。我的电脑可以处理一些额外的垃圾收集。我错了吗?我拥有最新最好的奔腾双核处理器和4GBRAM。我认为这应该足以处理一些字符串。 最佳答案 您的计算机可能能够处理“一点点额外的垃圾收集”,但是当“一点点”发生在运行数百万次的内部循环中时呢?如果它在内存有限的嵌入式系统上运行呢?有很多地方你可以随意使用字符串,但在某些地方你不能。这完全取决于上下文。 关于ruby-现代计算机的功能是否不足以处理字符串

  10. ruby - 如何在 Cucumber 的功能名称中使用空格 - 2

    我正在使用Windows并尝试运行一个现有的功能包,该功能包最初是在MacOS上构建的,这允许他们通过使用带空格的"\"来解决问题。我正在使用Ruby2.2.3和Cucumber。功能名称包含空格,我无法更改它。我尝试使用""和''来绕过空白,但每次都有同样的问题。这是问题的一个例子。如果我运行:cucumberfeatures/'Namecontainingwhitespaces.feature'它工作正常。但是当我运行时:cucumber-pmy_profile和cucumber.yml包含:my_profile:features/'Namecontainingwhitespace

随机推荐