Как программно настроить следующий фокусируемый элемент управления Android ActionBar - PullRequest
5 голосов
/ 11 февраля 2012

Я разрабатываю приложение для Google TV, в котором вся навигация будет осуществляться с помощью D-Pad / клавиатуры.

Моя активность имеет панель действий и несколько списков горизонтально под ней. сказать список A, B & C . Списки B & C загружают данные на основе выбранного элемента списка A .., поэтому они могут / не могут загружать данные.

Проблема в том, что когда ActionBar имеет фокус и я нажимаю клавишу D-Pad DOWN, фокус теряется и не передается в Список C (или B , если C не имеет данных) .. у?

Для достижения этой цели я попытался программно настроить следующий фокусируемый вид ActionBar, как показано ниже

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

но не сработало.

Я также пытался проверить иерархию макетов с помощью Hierarchy Viewer ... но, честно говоря, я не понимал, что делать с его выводами.

Как программно установить следующий фокусируемый элемент управления Android ActionBar ??

Любая помощь очень ценится.

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>

Все контейнеры каждого списка / сетки до самой верхней части LinearLayout установили android: focusable = "true" напрямую или в своем стиле.

РЕДАКТИРОВАТЬ: Пример приложения, описывающего точно экран моего spp можно загрузить с здесь

Пожалуйста, включите в первый список. Вы можете искать его по его идентификатору allPackagesList в файле main.xml. Я забыл вставить его. извините

Проблемы в этом приложении:

  1. Фокус не приходит к списку / сетке из элемента ActionBar.
  2. Для перемещения между элементами ActionBar требуется более одного нажатия D-Pad «Влево» или «Вправо» для перемещения

1 Ответ

0 голосов
/ 13 февраля 2012

Обернут ли Список внутри другого контейнера?Попробуйте добавить android: focusable = "true" для своих списков и их контейнеров.

...