-1

Я работаю в телевизионном приложении Android с MainFragment, которая простирается BrowseFragment, а иногда он выходит из строя в методе onFocusSearch(View focused, int direction), определенной для mOnFocusSearchListener в BrowseFragment:NullPointerException on onFocusSearch в BrowseFragment?

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****** , Эта авария не всегда появляется, но когда она говорит, что mMainFragment is null ...

Не удается найти неисправность. Помогите!

Обновление библиотеки постбакса, поможет?

+0

Не хранить ссылки на фрагменты, попытаться получить их от 'FragmentManager'. – Titus

ответ

0

onFocusSearchListener должен быть установлен после того, как onStart вызывается в BrowseFragment. Сбой, скорее всего, из-за того, что mMainFragment имеет нулевое значение или оно возвращается null, так как оно еще не добавлено. К моменту, когда вызывается onStart, будут вызваны методы жизненного цикла mMainFragment (включая onCreateView).

Похоже, что они устанавливают его в onCreate. Итак, что вы можете сделать, это захватить BrowseFrameLayout, чтобы этот слушатель был установлен, сохраните слушателя, который он установил на нем, отключите прослушиватель, а затем установите его в onStart в свой подкласс BrowseFragment.

В onCreateView вашего BrowseFragment подкласса:

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

Тогда в onStart вашего BrowseFragment подкласса:

mBrowseFrame.setOnFocusSearchListener(mOnFocusSearchListener); 
+0

Как я могу получить доступ к onFocusSearchListener, чтобы установить его в методе 'onStart' в моем подклассе? – whynottodayhum

+0

Я думаю, что есть много способов сделать это, чтобы попытаться решить проблему. Первоначально предполагалось, что вы устанавливаете свой собственный «OnFocusSearchListener». Один из вариантов - отключить фокус до 'onStart'. Другой - написать оболочку вокруг 'mOnFocusSearchListener', которая вызывает только' mOnFocusSearchListener', если 'mMainFragment' не является нулевым. Но опубликовано другое решение, более похожее на мое первое предложение выше. Пожалуйста, не стесняйтесь попробовать все эти варианты. –

Смежные вопросы