Android TV按钮不显示焦点可绘制

时间:2016-09-22 09:10:59

标签: java android android-studio android-tv

我计划在Android TV上发布游戏。我开发了包含一些按钮的游戏主屏幕。

我需要的是为每个按钮状态设置不同的drawable。我只需要三种状态:

  1. 默认
  2. 聚焦
  3. 为了根据不同的按钮状态显示不同的drawable,我创建了以下.xml文件:

    buttonquickgame.xml

        <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_pressed="true"
            android:drawable="@drawable/greenbutton_focused" /> <!-- pressed -->
        <item android:state_focused="true"
            android:drawable="@drawable/greenbutton_focused" /> <!-- focused -->
        <item android:drawable="@drawable/greenbutton" /> <!-- default -->
    </selector>
    

    我已将此xml文件放在res / drawable文件夹中。我完全按照谷歌的建议:https://developer.android.com/training/tv/start/navigation.html

    然后我将按钮的背景设置为先前的.xml文件,如下所示:

    <Button
        android:id="@+id/start"
        android:layout_width="250.0dip"
        android:layout_height="60.0dip"
        android:layout_marginTop="20dip"
        android:background="@drawable/buttonquickgame"
        android:onClick="OnClickButton"
        />
    

    问题是应用程序加载,按钮具有默认状态图标,当我按下它时,它正确显示按下的drawable,但无论如何都不会显示聚焦drawable。

    我已经尝试了一切。我甚至要求聚焦programmaticaly,焦点drawable不会出现。我在模拟器和索尼Android电视中检查过这种行为但没有成功。

    你对我在这里缺少什么有什么想法吗?

    非常感谢你!

1 个答案:

答案 0 :(得分:4)

经过大量的反复试验后,我找到了一个有效的解决方案。

新的选择器xml文件如下:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true"
        android:drawable="@drawable/orangebutton_pressed" /> <!-- pressed -->
    <item android:state_focused="true"
        android:drawable="@drawable/orangebutton_focused" /> <!-- focused -->
    <item android:drawable="@drawable/orangebutton" /> <!-- default -->
    <item android:drawable="@drawable/orangebutton_focused" android:state_focused="true" android:state_pressed="false" android:state_selected="true"/>

</selector>

在活动I中,我手动选择按钮并请求焦点如下:

   Button quick_start = (Button) findViewById(R.id.start);
   quick_start.setSelected(true);
   quick_start.requestFocus();

现在它在我的AndroidTV和模拟器上运行良好。

我希望如果你面临类似的问题,这个答案可以节省你一些时间!