在 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?

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

在 Android TV 的 BrowseFragment 标头中添加项目