【问题标题】:NullPointerException on onFocusSearch in BrowseFragment?BrowseFragment 中 onFocusSearch 上的 NullPointerException?
【发布时间】: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获取它们。

标签: android android-studio android-fragments android-tv leanback


【解决方案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。但是发布了另一个与我上面的第一个建议更相似的解决方案。请随意尝试所有这些选项。
猜你喜欢
  • 2015-02-01
  • 2017-03-09
  • 1970-01-01
  • 2016-08-02
  • 1970-01-01
  • 2016-12-25
  • 2015-11-30
  • 2015-09-21
  • 2017-12-11
相关资源
最近更新 更多