0

I am building an android app for gif search using GIPHYAPI, which contains multiple fragments and a search menu. whenever I am trying to pass query it gives error like "Attempt to read from null array".
Following is my mainactivity.java

public class MainActivity extends AppCompatActivity implements SearchView.OnQueryTextListener, TabLayout.OnTabSelectedListener{

private TabLayout tabLayout;
private GifAdapter adapter;
private ViewPager viewPager;
private Fragment[] mFragments;

@Override
public void onTabSelected(TabLayout.Tab tab) {
    viewPager.setCurrentItem(tab.getPosition());
}

@Override
public void onTabUnselected(TabLayout.Tab tab) {

}

@Override
public void onTabReselected(TabLayout.Tab tab) {

}
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    tabLayout = (TabLayout) findViewById(R.id.tabLayout);

    tabLayout.addTab(tabLayout.newTab().setText("Trending"));
    tabLayout.addTab(tabLayout.newTab().setText("Funny"));
    tabLayout.addTab(tabLayout.newTab().setText("Happy"));
    tabLayout.addTab(tabLayout.newTab().setText("Sad"));
    tabLayout.addTab(tabLayout.newTab().setText("Minion"));
    tabLayout.addTab(tabLayout.newTab().setText("Awesome"));
    tabLayout.addTab(tabLayout.newTab().setText("Search"));
    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

    viewPager = (ViewPager) findViewById(R.id.pager);

    Pager adapter = new Pager(getSupportFragmentManager(), tabLayout.getTabCount());

    viewPager.setAdapter(adapter);
    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
    tabLayout.setOnTabSelectedListener(this);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_items,menu);
    MenuItem menuItem = menu.findItem(R.id.action_search);
    SearchView searchView = (SearchView) MenuItemCompat.getActionView(menuItem);
    searchView.setOnSearchClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            viewPager.setCurrentItem(6); //Switch to SearchView
        }
    });
    searchView.setOnQueryTextListener(this);
    return true;
}

@Override
public boolean onQueryTextSubmit(String query) {
    viewPager.setCurrentItem(6);
    return ((Searchable) mFragments[6]).performSearch(query);
}

@Override
public boolean onQueryTextChange(String newText) {
    return false;
}
}

Following is my FragActivitySearch.java

public class FragActivitySearch extends Fragment implements Searchable {
private RecyclerView recyclerView;
private GifAdapter adapter;
protected ViewPager mViewPager;
private Fragment[] mFragments;

private String Query;
@Override
public boolean performSearch(String query) {
    Query = query;
    new GiphyTask(Helper.getGiphyQueryUrl(Query,
            100, GiphyQueryBuilder.EndPoint.SEARCH, ""), new GiphyTask.Callback() {
        @Override
        public void onResponse(List<Gif> gifs) {
            adapter.setGifs(gifs);
        }
    }).execute();

    return true;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    View rootView = inflater.inflate(R.layout.activity_search, container, false);
    recyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_view);
    recyclerView.setLayoutManager(new GridLayoutManager(getContext(), 1));

    adapter = new GifAdapter(getActivity(), new ArrayList<Gif>());
    recyclerView.setAdapter(adapter);

    recyclerView.setRecyclerListener(new RecyclerView.RecyclerListener() {
        @Override
        public void onViewRecycled(RecyclerView.ViewHolder holder) {
            GifAdapter.GifViewHolder gifHolder = (GifAdapter.GifViewHolder) holder;
            gifHolder.stopPlayback();
        }
    });

    return rootView;
}


}  

whenever I try to run this code it gives me following runtime error.

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.share.gifimage, PID: 8275
              java.lang.NullPointerException: Attempt to read from null array
                  at com.share.gifimage.MainActivity.onQueryTextSubmit(MainActivity.java:91)
                  at android.support.v7.widget.SearchView.onSubmitQuery(SearchView.java:1242)
                  at android.support.v7.widget.SearchView$9.onEditorAction(SearchView.java:1219)
                  at android.widget.TextView.onEditorAction(TextView.java:4902)
                  at com.android.internal.widget.EditableInputConnection.performEditorAction(EditableInputConnection.java:138)
                  at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:364)
                  at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:91)
                  at android.os.Handler.dispatchMessage(Handler.java:102)
                  at android.os.Looper.loop(Looper.java:154)
                  at android.app.ActivityThread.main(ActivityThread.java:6077)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)  

I just want to pass the query and load appropriate results.

1 Answers1

1

You never iitialized your mFragments array, and it seems null.

And this line,

((Searchable) mFragments[6]).performSearch(query);

you are trying to reach 6th element of null array.

Also your error log says the same thing:

java.lang.NullPointerException: Attempt to read from null array

You must initialize your array and add your fragments to this array.

Oğuzhan Döngül
  • 7,856
  • 4
  • 38
  • 52
  • I have initialized mFragment array and tried as you said, but now it gives ArrayIndexOutOfBoundsException. – Kalpesh Jagada Mar 31 '17 at 23:06
  • @KalpeshJagada if you do not add your fragments to your array, you cannot reach them via this ArrayList, it cannot be added magically, you need to add fragments manually. – Oğuzhan Döngül Apr 01 '17 at 11:23