5

I need to disable headers in BrowseFragment, and add to the ArrayObjectAdapter card. When I do a setHeadersState(HEADERS_DISABLED) application crushes. If I run setHeadersState(HEADERS_DISABLED) method later, for example in onLoadFinished, the application does not crash, but the header bar immediately visible and then hidden, not every time an item is displayed in the adapter.

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) {
                }
        }

Log:

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>
L. Swifter
  • 3,179
  • 28
  • 52
Andrei Anhurets
  • 143
  • 1
  • 13

3 Answers3

1

I have setHeadersState(HEADERS_DISABLED) in my fragment onCreate() method. It looks like you have yours in onActivityCreated(). You should try moving it. Let me know if that works.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHeadersState(HEADERS_DISABLED)
}
Kyle Venn
  • 4,597
  • 27
  • 41
  • I moved `setHeadersState(HEADERS_DISABLED)` to `onCreate()`, but nothing has changed. Application crash on startup with the same error `java.lang.NullPointerException: Attempt to invoke virtual method android.view.View android.app.Fragment.getView() on a null object reference` – Andrei Anhurets Aug 19 '16 at 08:43
  • Are you sure it's your `setHeadersState()` that is causing the crash? I would suggestion commenting everything else out except for that line (including the loader) and see if it still crashes. I have a fragment with nothing but `setHeaders` being called in `onCreate` and I haven't seen a crash. – Kyle Venn Aug 22 '16 at 15:08
  • I tried to leave only the method `setHeadersState(HEADERS_DISABLED)` in `onCreate()` problem still exists. As soon as I transfer the execution of the method `setHeadersState(HEADERS_DISABLED)` later (ie in `onLoadFinished`) - it works great! – Andrei Anhurets Aug 23 '16 at 09:00
  • What version of Leanback are you currently using? – Kyle Venn Aug 23 '16 at 15:19
  • It was 24.1.1. I updated to 24.2.0, but the problem remained. – Andrei Anhurets Aug 24 '16 at 07:02
  • How are you adding `MainFragment` to your view? Are you adding it via XML or are are you using the fragment manager? – Kyle Venn Aug 24 '16 at 15:50
  • `MainFragment fragment = new MainFragment(); getFragmentManager() .beginTransaction() .replace(R.id.fragment_container, fragment) .commit();` – Andrei Anhurets Aug 25 '16 at 14:54
  • Okay this shouldn't matter, but can you try declaring your fragment in your [layout XML](https://developer.android.com/training/basics/fragments/creating.html#AddInLayout) instead of using a transaction? – Kyle Venn Aug 25 '16 at 15:16
  • 1
    Instead transactions fragment, I put fragment in activity_main.xml. Nothing changed. The same error. – Andrei Anhurets Aug 26 '16 at 06:46
0

Maybe it'll be useful to you code.google.com issue

Viktor Dolgalyov
  • 274
  • 2
  • 12
0

As Viktor Dolgalyov has mentioned, there is a bug filed. #214795 which is followed by #223942 where there is an official reply that this will be fixed around December.

Community
  • 1
  • 1
Teng-pao Yu
  • 1,313
  • 15
  • 30