ListView的替代方案可避免EditText焦点问题?

时间:2014-12-12 05:50:13

标签: android android-listview android-edittext

情况

出于语言治疗工具的目的,需要将文本文件作为可编辑句子或短语的列表呈现,如下面的示例所示。这相对容易。

Ode To A Small Lump of Green Putty

可以根据需要添加,删除或拖动彩色标记到新位置,并可以设置为 对齐字符 snap-to-word (它们最终也会显示数据) 这是通过对EditText进行子分类来实现的,以利用所有内置功能,如自动换行,拼写检查,文本选择等。

问题

文档中的短语或句子数量可能很大,因此在LinearLayout中使用简单ScrollView来显示它们在这种情况下并不好。

为了有效地显示我的FlaggedEditText小部件,解决方案需要利用视图回收,因此ListView是一个明显的考虑因素。但正如S.O.的数量所示。那里的问题,ListViewEditText并不能很好地结合在一起 列表的要求是:

  • FlaggedEditText小部件在触摸时会得到关注(包含FlaggedEditText的项目也会被选中)。
  • 编辑列表中的项目时的通知(包括哪个项目)。
  • 标准手势,如投掷。

我已尝试过许多S.O.中提出的众多方法。过去几天的问题,尝试将ListView弯曲到我的要求,但似乎都有自己的缺点,导致hacky,凌乱的代码。

问题

  • 是否有人知道标准Android ListView的任何现有替代品,EditText更友好?
  • 或者,是否有人采用干净,高效,明确的方法让EditText按照标准ListView的要求正常工作?
  • 最后,我考虑对AdapterView进行子类化,以制作我自己的FlaggedEditText具体ListView替代方案。但如果问题源于AdapterView ListView也是一个间接的子类,那么我就是在浪费时间。有没有人走过这条路?

修改

Jim下面的精彩回应,最近观看了Romain Guy和Adam Powell的旧版Google I / O 2010演示文稿The world of ListView,提出了一个可能的解决方案。

在I / O谈话中,我被提醒他们将视图转换为位图以进行一些优化。由于每次只有一个EditText可以集中进行编辑,我认为我可以子类ListView来提供一个接口,如果ChoiceMode是单一的,它将给出一个Rect所选项目上方和下方的ListView区域的选定项目和位图。然后,可以使用此选项暂时将ListView覆盖为包含""的垂直LinearLayout。位图,有效FlaggedEditText和"低于"位图。

通过这种方式,FlaggedEditText窗口小部件可以在EditText中有效地充当不可聚焦的ListView,但是当选择一个项目时,交互就是临时覆盖。
"以上"和"以下"也可以很容易地对位图进行着色以表明不活动。

其他
事实上,我刚刚意识到我可能甚至不需要界面中所选项目的Rect。 "以上"和"以下"根据{{​​1}}使用相同FlaggedEditText的位图和LayoutParams就足够了。

1 个答案:

答案 0 :(得分:2)

那里的许多答案似乎没有描述围绕这个"问题的核心问题"以及它为什么不被解决。" "问题"你面临的是EditText可以与你的ListView一起扩展和/或滚动。此外,扩展的软键盘强制ListView重绘,从而导致跟踪焦点项目的问题。当一个项目聚焦并具有动态内容时,可以通过触摸手势发生UX混淆(例如,如果您触摸EditText中的项目,如光标然后滑动,您是否希望光标移动?或整个列表?)它可能会导致很多用户沮丧。

我确定你已经看过这篇文章了:

Issues focusing EditTexts in a ListView (Android)

这会在正确显示ListView中的元素,正确回收问题(重绘)和正确获得焦点的问题方面产生问题。创建一个扩展AdapterView的自定义类可能会起作用,但它可能仍然感觉像是一个黑客,并且可能无法按照您的意愿工作,或者这将是一项巨大的努力。

你需要做很多后端测量的字体,图像和"可见"自定义对象中的(或部分可见的)项目也考虑了键盘动画和双重滚动(ListView可以滚动,因此EditText - 或EditText的大小也会发生变化,强制父自定义AdapterView确定是否还应该滚动以及视图是否因为从聚焦对象添加或删除文本/图像而变得可见或不可见。

如果你做出类似&#34的假设,那么EditText永远不会大于X高度"然后你可以让它工作,但显然这是一个非常定制的解决方案,这就是为什么它不容易实现,一般不支持。

此外,您需要做出有关如何处理已滚动屏幕的焦点项目的UX决策(您可以轻松跟踪它,但如果它滚动回屏幕,但它可能会中断用户对如何滑动的期望和触摸手势处理 - 例如,EditText中的光标移动或整个列表?如果触摸图像,滑动移动图像还是滚动列表?你可以认为它是没有集中注意力,但随后的重绘事件会让它意外失去焦点,就像当前的ListView实施一样。)换句话说,你很可能会遇到许多意想不到的奇怪的UX问题。 ..

您最好的解决方案可能是使用上面引用的帖子中提到的对话框弹出窗口。或者,当点击要编辑的项目时,您可以在ListView上方或下方显示布局。您可能会让ListView滚动并锁定它 - 让它看起来好像在ListView中 - 但是再一次,软键盘改变可用部分会很困难屏幕 - 你可以期待"拖动"或者对#34; snap"影响。你需要做一个"完成"按钮...

要让自定义EditText使用此建议,您可以在ListView中将其停用并使其无法调整焦点,然后在整个EditText上放置一个空白布局捕获并处理触摸/甩/滑动事件。这"看不见"布局可能是你真正拥有的唯一选择。

换句话说,您可能应该计划更改UI / UX,而不是试图强制Android弄清楚如何处理这些布局的UX交互的几个动态的,可能相互矛盾或不可预测的方面。