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

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

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

Проблема заключается в том, что когда ActionBar имеет фокус и я нажимаю клавишу D-Pad ВНИЗ, фокус теряется и не переносится в список C (или B, если C< /strong> нет данных ) .. y?

Чтобы добиться этого, я попытался программно установить следующее фокусируемое представление 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>

All the containers of each List/Grid upto Top most LinearLayout have set android:focusable="true" directly or in its style.

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

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

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

  1. Фокус не приходит к списку/сеткам из элемента ActionBar.
  2. Навигация между элементами панели действий занимает более одного нажатия D-Pad «ВЛЕВО» ИЛИ «ВПРАВО» для перемещения

person Aamir    schedule 11.02.2012    source источник


Ответы (1)


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

person Megha Joshi - GoogleTV DevRel    schedule 13.02.2012
comment
это не сработало... я обновил свой вопрос и поместил XML активности.. я могу использовать некоторый пользовательский заголовок с кнопками (чтобы действовать как кнопки действий) и изображение для логотипа.. но я не хочу... как я хочу использовать встроенный ActionBar. Помогите разобраться, очень срочно - person Aamir; 13.02.2012
comment
Я не вижу ListView или ActionBar в xml. - person Megha Joshi - GoogleTV DevRel; 14.02.2012
comment
ListView и два GridView есть в xml... и я не добавлял ActionBar в XML... я просто установил тему в holo и раздул меню в onCreateOptionsMenu... и появилась панель ActionBar... я следовал руководству Android ActionBar от developer.android.com/guide/topics/ui/actionbar.html. извините, если я что-то пропустил, так как я новичок в андроиде - person Aamir; 14.02.2012
comment
извините, я не могу помочь здесь. Я попытался создать проект, чтобы воспроизвести проблему, но это очень большой XML-файл, и я не уверен, как вы его используете. Мне сложно отлаживать без простого исходного кода, который легко воспроизводит проблему. - person Megha Joshi - GoogleTV DevRel; 14.02.2012
comment
Я обновил свой вопрос и добавил ссылку на образец приложения. Вы можете скачать его... его XML точно такой же, как моя деятельность... чтобы вы точно знали, с какими проблемами я сталкиваюсь... ваша помощь очень ценится - person Aamir; 14.02.2012
comment
Джоши - я создал собственный заголовок для имитации встроенной панели действий, так как я застрял, а крайний срок проекта очень близок ... но, пожалуйста, дайте мне знать, если вы найдете его причину ... спасибо за ваше время - person Aamir; 16.02.2012
comment
Амир - я просмотрел ваш код, и вы должны установить android: focusable = true в своем представлении изображений, чтобы первое представление списка было в фокусе, когда вы опускаете крестовину. Также вид не получает фокус, когда крестовина вниз от опции панели действий меню, хотя. Тем временем вы пытаетесь не отображать элементы параметров на панели действий и отображать элементы, когда пользователь нажимает меню клавиатуры или использует настраиваемый заголовок, как вы это делали. - person Bhavya; 17.02.2012