如何以编程方式设置Android ActionBar的下一个可聚焦控件

时间:2012-02-11 10:16:32

标签: android android-layout google-tv android-actionbar

我正在为Google TV开发一个应用程序,其中所有导航都将使用D-Pad /键盘完成。

我的活动有一个ActionBar,下面有一些水平列表。说清单 A,B& ç即可。列出 B& C 根据所选列表 A ...加载数据,以便他们可能/不会加载数据。

问题是,当ActionBar有焦点并按下DOWN D-Pad键时,焦点会丢失并且不会转移到List C (或 B 如果 C 没有数据).. y?

为了达到这个目的,我尝试以编程方式设置ActionBar的下一个可聚焦视图,如下面的

getActionBar().getCustomView().setNextFocusDownId(R.Id.list_C_id);

但没有奏效。

我还尝试使用层次结构查看器检查布局层次结构......但是,坦率地说,我不明白如何处理它的发现。

如何以编程方式设置Android ActionBar的下一个可聚焦控件?

非常感谢任何帮助。

Activity的XML如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/mainContainer" style="@style/main" >

<!-- Splash Screen -->
<LinearLayout
    android:id="@+id/splash_screen"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/welcome"
    android:orientation="vertical" >
</LinearLayout> 

<!-- main content holder.. it is shown afetr some time of showing above splash screen -->
<LinearLayout
    android:id="@+id/main_content_screen"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:focusable="true"
    android:visibility="invisible">

    <!-- All Packages List -->

    <LinearLayout
        android:layout_width="205dp"
        android:layout_height="match_parent"
        android:background="@drawable/content_round_bg"
        android:focusable="true"
        android:orientation="vertical" >

        <!-- Header of Packages-->
        <RelativeLayout
            style="@style/marginLeft5"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"                
            android:background="@drawable/content_round_bg" >

            <ImageView
                android:id="@+id/packagesIcon"
                style="@style/titleIcon"
                android:src="@drawable/packages" >
            </ImageView>

            <TextView
                style="@style/title"
                android:layout_toRightOf="@+id/packagesIcon"
                android:text="Packages" >
            </TextView>

            <ProgressBar
                android:id="@+id/progressBarPackages"
                style="@style/progressBar" />
        </RelativeLayout>

        <!-- <View style="@style/horizontalSeperator" /> -->

        <ListView
            android:id="@+id/allPackagesList"
            style="@style/list"
            android:nextFocusRight="@+id/gridChannels">
        </ListView>

        <!-- Message which is hidden by default and is made visible if list has no data -->
        <LinearLayout
            android:id="@+id/packageNotFound"
            style="@style/emptyListIdentifier" >

            <ImageView
                style="@style/titleIcon"
                android:src="@drawable/info" >
            </ImageView>

            <TextView
                style="@style/emptyListIdentifierText"
                android:layout_marginLeft="5dp"
                android:text="Packages not available" >
            </TextView>
        </LinearLayout>
    </LinearLayout>

    <View style="@style/verticalSeperator" />

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:focusable="true"
        android:orientation="vertical" >

        <LinearLayout
            android:id="@+id/relativeLayout1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:focusable="true"
            android:layout_below="@+id/titleContainer" >

            <LinearLayout
                android:id="@+id/channelsContainer"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_weight="0.35"
                android:background="@drawable/content_round_bg"
                android:focusable="true"
                android:orientation="vertical" >

                <!-- Header of Channels-->
                <RelativeLayout
                    style="@style/marginLeft5"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="@drawable/content_round_bg" >

                    <ImageView
                        android:id="@+id/channelsIcon"
                        style="@style/titleIcon"
                        android:src="@drawable/channels" >
                    </ImageView>

                    <TextView
                        style="@style/title"
                        android:layout_toRightOf="@+id/channelsIcon"
                        android:text="Channels" >
                    </TextView>

                    <ProgressBar
                        android:id="@+id/progressBarChannels"
                        style="@style/progressBar" />
                </RelativeLayout>

                <RelativeLayout style="@style/listsContiner" android:focusable="true" >

                    <GridView
                        android:id="@+id/gridChannels"
                        style="@style/grid"
                        android:divider="#10F1F1F1"
                        android:nextFocusLeft="@+id/allPackagesList"
                        android:nextFocusRight="@+id/gridAllVODs"
                        android:numColumns="2" />
                </RelativeLayout>

                <!-- Message which is hidden by default and is made visible if list has no data -->
                <RelativeLayout
                    android:id="@+id/channelsNotFound"
                    style="@style/emptyListIdentifier" >

                    <ImageView
                        android:id="@+id/NoChannelsIcon"
                        style="@style/titleIcon"
                        android:src="@drawable/info" >
                    </ImageView>

                    <TextView
                        style="@style/emptyListIdentifierText"
                        android:layout_toRightOf="@+id/NoChannelsIcon"
                        android:text="Channels are currently not available" >
                    </TextView>
                </RelativeLayout>
            </LinearLayout>

            <View style="@style/verticalSeperator" />

            <LinearLayout
                android:id="@+id/vodsContainer"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_weight="0.65"                    
                android:background="@drawable/content_round_bg"
                android:orientation="vertical" >

                 <!-- Header of VODs-->
                <RelativeLayout
                    style="@style/marginLeft5"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="@drawable/content_round_bg" >

                    <ImageView
                        android:id="@+id/VODsIcon"
                        style="@style/titleIcon"
                        android:src="@drawable/vod" >
                    </ImageView>

                    <TextView
                        style="@style/title"
                        android:layout_toRightOf="@+id/VODsIcon"
                        android:text="VOD" >
                    </TextView>

                    <ProgressBar
                        android:id="@+id/progressBarVODs"
                        style="@style/progressBar" />
                </RelativeLayout>                    

                <RelativeLayout style="@style/listsContiner" >
                    <GridView
                        android:id="@+id/gridAllVODs"
                        style="@style/grid"
                        android:divider="#10F1F1F1"
                        android:nextFocusLeft="@+id/gridChannels"
                        android:nextFocusRight="@+id/allPackagesList"
                        android:numColumns="1" />
                </RelativeLayout>

                <!-- Message which is hidden by default and is made visible if list has no data -->

                <RelativeLayout
                    android:id="@+id/videosNotFound"
                    style="@style/emptyListIdentifier" >

                    <ImageView
                        android:id="@+id/NoVODsIcon"
                        style="@style/titleIcon"
                        android:src="@drawable/info" >
                    </ImageView>

                    <TextView
                        style="@style/emptyListIdentifierText"
                        android:layout_centerInParent="true"
                        android:layout_toRightOf="@+id/NoVODsIcon"
                        android:text="Videos are currently not available" >
                    </TextView>
                </RelativeLayout>
            </LinearLayout>
        </LinearLayout>
    </RelativeLayout>
</LinearLayout>

每个List / Grid的所有容器直到Top LinearLayout都直接或以其样式设置了android:focusable =“true”。

编辑:可以从 here

下载完整描述我的spp屏幕的示例应用

请在第一个列表中加入 。您可以通过main.xml文件中的id allPackagesList 进行搜索。我忘了插入它。遗憾

此应用中的问题包括:

  1. 焦点不会来自ActionBar项目的列表/网格。
  2. ActionBar项目之间的导航需要多个D-Pad“LEFT”或“RIGHT”按下才能移动

1 个答案:

答案 0 :(得分:0)

List是否包含在另一个容器中?尝试为您的列表及其容器添加android:focusable =“true”..