-1

私はBrowseFragmentを拡張し、時にはそれがBrowseFragmentmOnFocusSearchListenerのために定義された方法onFocusSearch(View focused, int direction)にクラッシュしMainFragmentとAndroidのテレビアプリで働いている: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

onStartBrowseFragmentで呼び出された後に、onFocusSearchListenerを設定する必要があります。 mMainFragmentがnullであるか、または実際にはまだ追加されていないため返されるビューがnullであるため、クラッシュが発生している可能性があります。 onStartが呼び出されるまでには、mMainFragmentライフサイクルメソッドが呼び出されます(onCreateViewを含む)。

onCreateに設定しているようです。あなたができることは、BrowseFrameLayoutを取得して、このリスナーが設定されているリスナーを保存し、リスナーを無効にして、サブクラスBrowseFragmentonStartに戻します。あなたの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'を設定していると仮定しました。 1つのオプションは 'onStart'までフォーカスを無効にすることです。もう一つは 'mOnFocusSearchListener'の周りに' mMainFragment'がnullでない場合にのみ 'mOnFocusSearchListener'を呼び出すラッパーを書くことです。しかし、上記の私の最初の提案に似ている別のソリューションを掲載しました。これらのオプションをすべて試してみてください。 –

関連する問題