-1

我在Android TV的應用正與一個MainFragment擴展BrowseFragment,有時在BrowseFragmentmOnFocusSearchListener定義的方法onFocusSearch(View focused, int direction)崩潰:BrowseFragment中onFocusSearch上的NullPointerException?

private final BrowseFrameLayout.OnFocusSearchListener mOnFocusSearchListener = 
     new BrowseFrameLayout.OnFocusSearchListener() { 
    @Override 
    public View onFocusSearch(View focused, int direction) { 
     // if headers is running transition, focus stays 
     if (mCanShowHeaders && isInHeadersTransition()) { 
      return focused; 
     } 
     if (DEBUG) Log.v(TAG, "onFocusSearch focused " + focused + " + direction " + direction); 

     if (getTitleView() != null && focused != getTitleView() && 
       direction == View.FOCUS_UP) { 
      return getTitleView(); 
     } 
     if (getTitleView() != null && getTitleView().hasFocus() && 
       direction == View.FOCUS_DOWN) { 
      return mCanShowHeaders && mShowingHeaders ? 
        mHeadersFragment.getVerticalGridView() : 
        mMainFragment.getView(); 
     } 

     boolean isRtl = ViewCompat.getLayoutDirection(focused) == View.LAYOUT_DIRECTION_RTL; 
     int towardStart = isRtl ? View.FOCUS_RIGHT : View.FOCUS_LEFT; 
     int towardEnd = isRtl ? View.FOCUS_LEFT : View.FOCUS_RIGHT; 
     if (mCanShowHeaders && direction == towardStart) { 
      if (isVerticalScrolling() || mShowingHeaders) { 
       return focused; 
      } 
      return mHeadersFragment.getVerticalGridView(); 
     } else if (direction == towardEnd) { 
      if (isVerticalScrolling()) { 
       return focused; 
      } 
      return mMainFragment.getView(); //*****CRASH****** 
     } else { 
      return null; 
     } 
    } 
}; 

注:這裏崩潰發生標有//*****CRASH******線。 這次崩潰並不總是出現,但當它確實表示mMainFragmentnull ...

找不到問題。幫幫我!

更新leanback庫,會有幫助嗎?

+0

不要把引用片段,嘗試從'FragmentManager'得到他們。 – Titus

回答

0

onFocusSearchListener應在onStart被調用後調用BrowseFragment。崩潰很可能是因爲mMainFragment爲空,或者它返回的視圖爲空,因爲它尚未實際添加。在調用onStart時,將調用mMainFragment生命週期方法(包括onCreateView)。

看起來他們正在將它設置爲onCreate。因此,您可以做的是抓住正在設置此偵聽器的BrowseFrameLayout,保存它們設置的偵聽器,清空偵聽器,然後將其重新設置爲您的子類BrowseFragment中的onStart

在你BrowseFragment子類onCreateView

BrowseFrameLayout mBrowseFrame = (BrowseFrameLayout) v.findViewById(R.id.browse_frame); 
    OnFocusSearchListener mOnFocusSearchListener = mBrowseFrame.getOnFocusSearchListener(); 
    mBrowseFrame.setOnFocusSearchListener(null); 

然後在你的BrowseFragment子類的onStart

mBrowseFrame.setOnFocusSearchListener(mOnFocusSearchListener); 
+0

如何訪問onFocusSearchListener,以便我可以在我的子類中的onStart方法中設置它? – whynottodayhum

+0

我認爲有很多方法可以嘗試解決這個問題。我原本以爲你正在設置你自己的'OnFocusSearchListener'。一種選擇是禁用焦點,直到「onStart」。另一種方法是在'mOnFocusSearchListener'周圍編寫一個封裝器,如果'mMainFragment'不爲null,則只調用'mOnFocusSearchListener'。但發佈了另一個更類似於我上面第一個建議的解決方案。請隨時嘗試所有這些選項。 –