BrowseFragment 中 onFocusSearch 上的 NullPointerException?
Posted
技术标签:
【中文标题】BrowseFragment 中 onFocusSearch 上的 NullPointerException?【英文标题】:NullPointerException on onFocusSearch in BrowseFragment? 【发布时间】:2017-02-10 19:27:49 【问题描述】:我正在使用扩展BrowseFragment
的MainFragment
使用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******
。
这种崩溃并不总是出现,但是当它说mMainFragment
是null
...
找不到问题。救命!
更新leanback库,会有帮助吗?
【问题讨论】:
不要保留对片段的引用,尝试从FragmentManager
获取它们。
【参考方案1】:
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);
【讨论】:
如何访问 onFocusSearchListener 以便在我的子类的onStart
方法中设置它?
我认为有很多方法可以解决这个问题。我最初假设您正在设置自己的OnFocusSearchListener
。一种选择是在onStart
之前禁用焦点。另一种方法是在mOnFocusSearchListener
周围编写一个包装器,如果mMainFragment
不为空,它只会调用mOnFocusSearchListener
。但是发布了另一个与我上面的第一个建议更相似的解决方案。请随意尝试所有这些选项。以上是关于BrowseFragment 中 onFocusSearch 上的 NullPointerException?的主要内容,如果未能解决你的问题,请参考以下文章
Android Leanback 库 BrowseFragment
Android TV 在 BrowseFragment 中重新加载数据
从 Android TV 中的 BrowseFragment 中删除上边距