2012-07-19 24 views
2

我開發的應用程序的谷歌電視,我有我的應用程序使用left navigation bar。我下載了谷歌電視的例子,並與左輪手柄玩,使其按照我的要求工作。我希望它的行爲類似於Google TV的電視或YouTube電視應用程序&。當焦點通過左D-Pad鍵移動到其選項卡時它應該展開,並且在使用右D-Pad鍵從其移動焦點時摺疊。GoogleTV的LeftNavBar重點

餘did't知道,如果有任何屬性,這將幫助我實現這個功能。

所以,我試圖通過註冊setOnFocusChangeListener監聽器和調用flipOption(LeftNavBar.DISPLAY_AUTO_EXPAND)功能的它,如下所示,迫使它表現我想要的方式:

private LeftNavBar getLeftNavBar() { 
    if (mLeftNavBar == null) { 
     ------- 
     ------- 
     mLeftNavBar.setOnFocusChangeListener(new View.OnFocusChangeListener() { 

      @Override 
      public void onFocusChange(View v, boolean hasFocus) { 

       flipOption(LeftNavBar.DISPLAY_AUTO_EXPAND); 
      } 
     }); 


    } 
    return mLeftNavBar; 
} 

現在上面的代碼工作正常時,有沒有在leftNavBar。它顯示/隱藏接收/放鬆焦點。但是當我添加一些標籤時它不起作用。

任何想法如何實現的呢?

+1

Android 4.x上的leftnavbar存在問題。它只在GTV Honeycomb OS上擴展和崩潰,但不在JB OS上。 因此,在GTV將更新至v.4之後,leftnavbar將會按預期停止工作。它需要修復。 – mcd2000 2013-09-09 09:58:51

回答

2

googletv-android-samples既有LeftNavBar代碼和LeftNavBarDemo。如果你使用LeftNavBarDemo,你可以看到你需要完成你想要的行爲的設置。

這只是設置了正確的選項 - 你真的不需要flipOption onFocusChange - 如果設置正確的初始選項會膨脹和收縮automagicly。我會給你具體的,但每個應用程序是不同的。

+0

我也試過了..但是不能讓它工作......如果通過「選項」,你的意思是通過LeftNavBarDemo細節片段上按鈕的選項設置。然後我也試過了。但沒有工作......但如果你在談論設置XML文件中的選項,那麼我不知道該怎麼做。 ..所以你可以請給一些具體??? – Aamir 2012-07-20 05:48:43

+0

您下載了LeftNavBarLibrary&LeftNavBarDemo並運行了LeftNavBarDemo,但無法使其工作?我會看看我能否在AM中整理更詳細的說明。但是如果你無法做到這一點,那麼你將很難得到其他工作。 – 2012-07-20 07:17:36

+0

我很抱歉浪費你的時間和尷尬自己。這只是不能在模擬器上工作..我通過修改模擬器上的屬性進行檢查..我認爲新的ADT更新已經導致模擬器以這種方式表現...只要我在Google TV上安裝應用程序..它開始工作。 – Aamir 2012-07-20 10:16:09

0

我在猜測GTV團隊已經在GoogleTV操作系統的View Hierarchy中添加了一些特殊的醬料,因爲這個神奇的方法在LeftNavBar的任何一個孩子獲得焦點時以某種方式被調用。

protected void onDescendantFocusChanged(boolean hasFocus) { 
     super.onWindowFocusChanged(hasFocus); 
     if (has(mDisplayOptions, LeftNavBar.DISPLAY_AUTO_EXPAND)) { 
      setExpanded(hasFocus); 
     } 
    } 

我看不出模仿這種使用其他方法,所以我下面執行黑客。

1)在onFinishInflate()的LeftNavView.java末尾添加以下代碼時,底層的ListView獲得焦點,這樣就可以展開菜單來檢測。遺憾的是它並不像使用hasFocus == false,以可靠地關閉菜單那麼簡單,所以請參閱步驟2

@Override 
protected void onFinishInflate() { 
    //... 
    //existing code 
    //... 
    TabListView tabListView = (TabListView)mTabs.getView(); 
    tabListView.setOnFocusChangeListener(new OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      if (hasFocus) 
       setExpanded(true, true); 
     } 
    }); 
} 

2)添加下面的focusSearch(布爾hasFocus)在LeftNavView.java的頂部塌陷菜單(如果LeftNavBar已有焦點和DPAD方向是正確的

@Override 
public View focusSearch(View focused, int direction) { 
    //if leftnav hasFocus but direction is right then collapse the nav menu 
    if (hasFocus() && direction == View.FOCUS_RIGHT) { 
     setExpanded(false, true); 
    } 

    //... 
    //existing code 
    //... 
} 

警告:有了這個本事,你需要小心的是你沒有加載時(或者調用該請求將焦點的觀點。 requesFocus()或者在你的佈局中實現requestFocus />標籤)。在這種情況下,你的視圖會獲得焦點,但菜單仍然會被擴展,在某些情況下,你會你將無法使用dpad將注意力集中在菜單上(取決於視圖的佈局)

如果您想要將注意力集中在新加載的片段中,那麼您可以實現並調用下面的方法(在onActivityCreated()的結尾處)作爲解決方法。

//e.g. passing in KeyEvent.KEYCODE_DPAD_RIGHT 
public static void simulateKey(final int KeyCode) { 
     new Thread() { 
      @Override 
      public void run() { 
       try { 
        Instrumentation inst = new Instrumentation(); 
        inst.sendKeyDownUpSync(KeyCode); 
       } catch (Exception e) { 
        Log.e(TAG, "Exception when sendKeyDownUpSync " + e.toString()); 
       } 
      } 
     }.start(); 
    }