在 BrowseFragment 中禁用标题
Posted
技术标签:
【中文标题】在 BrowseFragment 中禁用标题【英文标题】:Disabling headers in BrowseFragment 【发布时间】:2016-12-25 11:36:56 【问题描述】:我需要禁用 BrowseFragment 中的标头,并添加到 ArrayObjectAdapter 卡。当我执行setHeadersState(HEADERS_DISABLED)
应用程序崩溃时。如果我稍后运行setHeadersState(HEADERS_DISABLED)
方法,例如在onLoadFinished
中,应用程序不会崩溃,但标题栏会立即可见然后隐藏,而不是每次在适配器中显示项目时。
MainFragment.class
public class MainFragment extends BrowseFragment implements LoaderManager.LoaderCallbacks<List<Module>>
private static final int MODULES_LOADER_ID = 100;
private ArrayObjectAdapter mRowsAdapter;
@Override
public void onActivityCreated(Bundle savedInstanceState)
super.onActivityCreated(savedInstanceState);
setupUIElements();
setupRowAdapter();
setupListeners();
getLoaderManager().initLoader(MODULES_LOADER_ID, null, this);
private void setupUIElements()
setTitle(getActivity().getString(R.string.app_name));
setBadgeDrawable(getResources().getDrawable(R.drawable.title, getActivity().getTheme()));
setHeadersTransitionOnBackEnabled(false);
setBrandColor(getActivity().getResources().getColor(R.color.fastlane_background));
setHeadersState(HEADERS_DISABLED);
private void setupRowAdapter()
mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());
setAdapter(mRowsAdapter);
private void setupListeners()
setOnItemViewSelectedListener(new ItemViewSelectedListener());
setOnItemViewClickedListener(new ItemViewClickedListener());
private void loadModules(List<Module> modules)
ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(new ModulesCardPresenter());
for (Module module : modules)
listRowAdapter.add(module);
HeaderItem header = new HeaderItem(0, "Меню");
mRowsAdapter.add(new ListRow(header, listRowAdapter));
@Override
public Loader<List<Module>> onCreateLoader(int id, Bundle args)
switch (id)
case MODULES_LOADER_ID:
return new ModulesLoader(getActivity());
default:
return null;
@Override
public void onLoadFinished(Loader<List<Module>> loader, List<Module> data)
switch (loader.getId())
case MODULES_LOADER_ID:
loadModules(data);
break;
@Override
public void onLoaderReset(Loader<List<Module>> loader)
static class ModulesLoader extends SimpleAsyncTaskLoader<List<Module>>
public ModulesLoader(Context context)
super(context);
@Override
public List<Module> loadInBackground()
Call<Modules> mCall = ServiceHolder.getService()
.getModules(Constants.GET_MODULES_REQUEST);
try
return mCall.execute().body().getModules();
catch (Exception e)
e.printStackTrace();
return Collections.EMPTY_LIST;
private final class ItemViewSelectedListener implements OnItemViewSelectedListener
@Override
public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item,
RowPresenter.ViewHolder rowViewHolder, Row row)
private final class ItemViewClickedListener implements OnItemViewClickedListener
@Override
public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item,
RowPresenter.ViewHolder rowViewHolder, Row row)
日志:
08-18 16:06:08.331 29647-29647/ E/androidRuntime: FATAL EXCEPTION: main
Process: , PID: 29647
**java.lang.RuntimeException: Unable to start activity ComponentInfo.MainActivity: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.app.Fragment.getView()' on a null object reference**
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
**Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.app.Fragment.getView()' on a null object reference**
at android.support.v17.leanback.app.BrowseFragment.onStart(BrowseFragment.java:1511)
at android.app.Fragment.performStart(Fragment.java:2244)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1002)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1148)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1130)
at android.app.FragmentManagerImpl.dispatchStart(FragmentManager.java:1958)
at android.app.FragmentController.dispatchStart(FragmentController.java:163)
at android.app.Activity.performStart(Activity.java:6274)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) </code>
【问题讨论】:
【参考方案1】:我的片段onCreate()
方法中有setHeadersState(HEADERS_DISABLED)
。看起来你在onActivityCreated()
中有你的。你应该试着移动它。让我知道这是否有效。
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setHeadersState(HEADERS_DISABLED)
【讨论】:
我将setHeadersState(HEADERS_DISABLED)
移至onCreate()
,但没有任何改变。启动时应用程序崩溃并出现相同的错误java.lang.NullPointerException: Attempt to invoke virtual method android.view.View android.app.Fragment.getView() on a null object reference
您确定是您的setHeadersState()
导致了崩溃吗?我建议将除该行(包括加载程序)之外的所有内容都注释掉,看看它是否仍然崩溃。我有一个片段,除了 setHeaders
之外什么都没有,在 onCreate
中被调用,我还没有看到崩溃。
我试图在onCreate()
中只留下方法setHeadersState(HEADERS_DISABLED)
问题仍然存在。一旦我稍后转移方法setHeadersState(HEADERS_DISABLED)
的执行(即在onLoadFinished
中) - 它工作得很好!
您目前使用的是哪个版本的 Leanback?
代替事务片段,我将片段放在activity_main.xml中。没有改变。同样的错误。【参考方案2】:
也许对你有用 code.google.com issue
【讨论】:
谢谢。不幸的是,只有一个问题,但没有解决方案:(【参考方案3】:由于Viktor Dolgalyov 具有mentioned,因此存在一个错误提交。 #214795 后面是#223942 官方回复说会在12月左右修复。
【讨论】:
以上是关于在 BrowseFragment 中禁用标题的主要内容,如果未能解决你的问题,请参考以下文章
Android Leanback 库 BrowseFragment
Android TV 在 BrowseFragment 中重新加载数据
如何始终在 Leanback BrowseFragment 中显示标题侧栏?
BrowseFragment 中 onFocusSearch 上的 NullPointerException?