You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中requestFocus()使TextView获焦但无高亮的问题排查

问题:代码调用requestFocus()后TextView获焦但无高亮显示

我使用搭载Android 9系统、带硬件键盘的Datalogic Memor K移动计算机。在应用中,手动通过硬件方向键可在控件间移动焦点/高亮,包括设置isFocusableInTouchMode = true的TextView控件。但通过代码调用requestFocus()时,返回值为true,TextView看似已获取焦点(后续方向键操作从它开始),却未显示高亮效果。

我基于Empty activity模板创建项目,为提升可见性,在res/value/themes.xml中添加如下配置:

<!-- Customize your theme here. -->
<item name="android:textSize">25sp</item>
<item name="colorControlHighlight">@color/purple_700</item>
</style>
</resources>

为精简内容,我未使用布局文件,所有操作均在主Activity代码中完成:

@file:SuppressLint("SetTextI18n")
package lv.trialto.myapplication

import android.annotation.SuppressLint
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.ViewGroup
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
import android.widget.Button
import android.widget.LinearLayout
import android.widget.TextView
import android.widget.Toast
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val numbers = arrayOf("One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine")
        var nextNumberIndex = 0

        val rootLinearLayout = LinearLayout(this).apply {
            layoutParams = ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)
            orientation = LinearLayout.VERTICAL
        }

        val textViewList = mutableListOf<TextView>()

        for (y in 1..3) {
            val horizontalLinearLayout = LinearLayout(this).apply {
                layoutParams = ViewGroup.LayoutParams(MATCH_PARENT, WRAP_CONTENT)
                orientation = LinearLayout.HORIZONTAL
            }

            rootLinearLayout.addView(horizontalLinearLayout)

            for (x in 1..3) {
                val cell = TextView(this).apply {
                    width = (100 * context.resources.displayMetrics.density + 0.5).toInt()
                    isFocusableInTouchMode = true
                    text = numbers[nextNumberIndex++]
                }

                textViewList.add(cell)
                horizontalLinearLayout.addView(cell)
            }
        }

        rootLinearLayout.addView(Button(this).apply {
            layoutParams = ViewGroup.LayoutParams(MATCH_PARENT, WRAP_CONTENT)
            text = "Focus random cell"
            setOnClickListener {
                val randomTextView = textViewList[textViewList.indices.random()]
                val saveText = randomTextView.text
                randomTextView.text = "HERE!"
                val result = randomTextView.requestFocus()
                Toast.makeText(context, "result = $result", Toast.LENGTH_LONG).show()

                lifecycleScope.launch {
                    delay(1000)
                    randomTextView.text = saveText
                }
            }
        })

        setContentView(rootLinearLayout)
    }
}

疑问

  • 我哪里操作有误?
  • 这种焦点对应的高亮效果,正确的名称是什么?

内容的提问来源于stack exchange,提问作者Andrew Usachov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 02:50:27