我有一个包含注释列表的对话框,我想让用户滚动到列表的末尾,找到“确定”按钮以关闭对话框。
该对话框包含一个ListView,我使用页脚行将该按钮添加到列表中。
View footerView = ((LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE)).
inflate(R.layout.list_footer_button, null, false);
listView.addFooterView(footerView);
当我打开对话并打开此对话框时,它会读取ListView的错误计数,因为它包括页脚行。例如,如果我的列表有3个项目,则对话为“第1项,共4项”。
ISSUE
如何让talkBack读取忽略页脚行的正确项目数?
OR
如果我不能改变这个,我怎么创建一个对话框,用户必须滚动到列表的末尾才能看到按钮以关闭对话框。
答案 0 :(得分:0)
我已经通过将按钮添加到最后一行的View而不是添加页脚来解决了这个问题。
我的每行布局包含一个textView和一个按钮,按钮设置为“不可见”。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<LinearLayout android:id="@+id/notes_details"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<!-- other views here but removed for this post -->
<TextView
android:id="@+id/notes_text"
style="@style/notes_text_style"/>
</LinearLayout>
<Button
android:id="@+id/notes_button"
style="@style/notes_button"
android:layout_below="@id/notes_details"
android:layout_centerHorizontal="true"
android:visibility="invisible" />
</RelativeLayout>
在列表的适配器中,我根据行是否是最后一行显示/隐藏按钮
boolean isLastRow = iPosition == getCount()-1;
okButton.setVisibility(isLastRow ? View.VISIBLE : View.GONE);
需要更改辅助功能
还有一些额外的工作要使这一切都可用于辅助功能。如果未对支持可访问性进行任何更改,则只能对行进行导航。因此,最后一行将选择备注文本和确定按钮作为一个可选项目,您将无法使用键盘/跟踪球导航到该按钮。
首先,您必须设置列表,以便连续的项目可以聚焦
listView.setItemsCanFocus(true);
其次,在适配器的代码中,我在notes textView和button上设置了focusable / nextFocusXXX
// when in accessibility mode, we want to set the navigation order for
// the list item's text and the OK button
boolean isLastRow = iPosition == getCount()-1;
if (isAccessibilityEnabled) {
notesTextView.setFocusable(true);
okButton.setFocusable(true);
rowView.setNextFocusForwardId(isLastRow ? R.id.notes_button: R.id.notes_text);
rowView.setNextFocusDownId(isLastRow ? R.id.notes_button: R.id.notes_text);
okButton.setNextFocusUpId(R.id.notes_text);
}
答案 1 :(得分:0)
我对此问题有另一个用例。
<强>要求强>
我有一个包含项目列表的屏幕,我在屏幕右下方有一个浮动操作按钮(FAB),允许用户将项目添加到列表中。在每行的右侧是一个按钮,显示该行项的选项。
我需要FAB不覆盖列表中的最后一行,否则我永远无法点击最后一行的右侧按钮,因为它将位于FAB下方。
解决方案及其问题
我尝试了几种解决方案。一个是在列表项中添加一个额外的计数,当获取最后一行的视图时,我返回一个空视图,即FAB的高度。我还尝试将此空填充行添加为列表页脚。在这两种情况下,TalkBack都会为列表中的项目数量读取太多。
我无法使用我针对此问题发布的解决方案作为我的笔记列表。我需要FAB始终位于屏幕的右下角(不仅仅是在最后一行之后),即使列表中只有1个或2个项目,也不是屏幕上的项目。
工作解决方案
将下面代码中的最后4个属性添加到xml布局中的列表定义中似乎解决了这个问题。没有其他项目添加到列表中,因此TalkBack正确读取列表计数,以下内容确保屏幕左下方的FAB永远不会与最后一行重叠。
<!-- Instead of adding a footer row to stay clear of the FAB,
add a padding to the listView and set clipToPadding to false
android:overScrollFooter is set to transparent to avoid having a divider
for the last item so there is just white space below the last item -->
<ListView
style="@style/my_list_style"
android:layout_alignParentTop="true"
android:paddingBottom="82dp"
android:clipToPadding="false"
android:footerDividersEnabled="false"
android:overScrollFooter="@android:color/transparent"/>