3

我目前正在使用 Android 的 Textview 的选取框功能。但是有一个问题 - 我有一个包含一些 TextView 的布局。其中一个显示音乐文件的标题,我想应用选取框功能。另一方面,我不断更新当前的曲目时间(每秒)。

问题是,每次更新显示跟踪时间的 TextView (setText()) 时,其他 TextView 的选取框就会停止。我猜这是因为 setTExt() 将焦点移到了我要将文本应用到的 TextView 上。

有解决方案吗?

我为本教程中的字幕 TextView 使用了一个自定义类

其他 TextView 是否有可能(也可能是自定义类)不“窃取”焦点?

谢谢!

问候

4

6 回答 6

4

当 TextView 被 setEnabled(true) 或接收焦点时启用选取框。使用 setEnabled(true) 确保其他 TextView 在焦点移动时不会停止选取框。

于 2011-02-11T22:08:18.857 回答
4

在我的情况下setEnabled(true)没有帮助。既不请求焦点,也不要求任何类似的东西,因为焦点不是问题。我相信每当 TextView 通过时选框也会重新启动onLayout()

在我的情况下,TextView 位于具有layout_height="wrap_content". 显示跟踪时间的 TextView 位于带有选取框的 TextView 下方。现在,当我每秒都在更新较低的 TextView 时,我相信操作系统会从头开始计算它的高度,并根据 TextView 的高度计算整个 LinearLayout 的高度(当然,每次都是相同的)。这就是为什么整个 LinearLayout(以及它的孩子)正在onLayout()重新启动选取框的原因。

长话短说,我将容器 LinearLayout 的高度设置为固定值,然后选取框开始工作。

于 2012-11-22T13:52:48.740 回答
3

但是有一个问题 - 我有一个包含一些 TextView 的布局。我在这里找到了解决方案: http ://androidbears.stellarpc.net/?p=185

您应该扩展 TextView 类并覆盖几个方法

@Override
protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
    if(focused)
       super.onFocusChanged(focused, direction, previouslyFocusedRect);
}



@Override
public void onWindowFocusChanged(boolean focused) {
    if(focused)
       super.onWindowFocusChanged(focused);
}

@Override
public boolean isFocused() {
       return true;
}
于 2012-09-26T13:22:38.353 回答
1

你可以简单地requestFocus(); 在新音乐 TextView 更新后,回到您想要选取框的 TextView。如果您无法做到这一点,请发布一些我们可以提供帮助的代码。

TextView.requestFocus()

于 2011-02-11T22:05:17.937 回答
1

在这里查看我的答案:https ://stackoverflow.com/a/13841982/1823503

这个想法是:

  • 以编程方式固定宽度和高度
  • 设置选定
  • 覆盖您的 TextView 以解决焦点问题
于 2012-12-12T14:43:46.753 回答
0

您可以简单地用 LinearLayout 包装选取框 TextView

于 2016-08-01T06:42:37.117 回答