BrowseFragment 中 onFocusSearch 上的 NullPointerException?

Posted

技术标签:

【中文标题】BrowseFragment 中 onFocusSearch 上的 NullPointerException?【英文标题】:NullPointerException on onFocusSearch in BrowseFragment? 【发布时间】:2017-02-10 19:27:49 【问题描述】:

我正在使用扩展BrowseFragmentMainFragment 使用android TV 应用程序,有时它会在BrowseFragment 中为mOnFocusSearchListener 定义的方法onFocusSearch(View focused, int direction) 中崩溃:

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库,会有帮助吗?

【问题讨论】:

不要保留对片段的引用,尝试从FragmentManager获取它们。 【参考方案1】:

onFocusSearchListener 应该在onStartBrowseFragment 调用之后设置。崩溃很可能是因为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);

【讨论】:

如何访问 onFocusSearchListener 以便在我的子类的onStart 方法中设置它? 我认为有很多方法可以解决这个问题。我最初假设您正在设置自己的OnFocusSearchListener。一种选择是在onStart 之前禁用焦点。另一种方法是在mOnFocusSearchListener 周围编写一个包装器,如果mMainFragment 不为空,它只会调用mOnFocusSearchListener。但是发布了另一个与我上面的第一个建议更相似的解决方案。请随意尝试所有这些选项。

以上是关于BrowseFragment 中 onFocusSearch 上的 NullPointerException?的主要内容,如果未能解决你的问题,请参考以下文章

在 BrowseFragment 中禁用标题

Android Leanback 库 BrowseFragment

Android TV 在 BrowseFragment 中重新加载数据

从 Android TV 中的 BrowseFragment 中删除上边距

AndroidTV - 更改行标题的颜色 [BrowseFragment]

无法刷新 BrowseFragment 中的数据