0

I've spent my last 8 hours to solve this simple dumb NPE(about to go mentally blind).Almost read everything about this issue,tried everything possible but same result,so I'll be posting every code related,I hope someone can help !

First of all this is the full error I get through logcat;

2019-03-12 11:16:56.130 23426-23426/com.demotxt.myapp.myapplication E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.demotxt.myapp.myapplication, PID: 23426
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.SearchView.setSearchableInfo(android.app.SearchableInfo)' on a null object reference
        at com.demotxt.myapp.myapplication.activities.Main3Activity.onCreateOptionsMenu(Main3Activity.java:130)
        at android.app.Activity.onCreatePanelMenu(Activity.java:3317)
        at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:340)
        at android.support.v7.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:93)
        at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.onCreatePanelMenu(AppCompatDelegateImplBase.java:332)
        at android.support.v7.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:93)
        at android.support.v7.app.ToolbarActionBar.populateOptionsMenu(ToolbarActionBar.java:454)
        at android.support.v7.app.ToolbarActionBar$1.run(ToolbarActionBar.java:55)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6682)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)

My Main3Activity which I do stuff about searching;

public class Main3Activity extends AppCompatActivity {

    private final String JSON_URL = "https://MYURLXX" ;
    private JsonArrayRequest request ;
    private RequestQueue requestQueue ;
    private List<Anime> lstAnime ;
    private RecyclerView recyclerView ;
    RecyclerViewLiveAdapter adapter;
    RecyclerView.LayoutManager layoutManager;

    Toolbar toolbar;
    SearchView searchView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main3);
        toolbar=findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);


        lstAnime = new ArrayList<>() ;
        recyclerView = findViewById(R.id.recyclerviewid);
        jsonrequest();



    }

    private void jsonrequest() {

        request = new JsonArrayRequest(JSON_URL, new Response.Listener<JSONArray>() {
            @Override
            public void onResponse(JSONArray response) {

                JSONObject jsonObject  = null ;

                for (int i = 0 ; i < response.length(); i++ ) {


                    try {
                        jsonObject = response.getJSONObject(i) ;
                        Anime anime = new Anime() ;
                        anime.setName(jsonObject.getString("name"));
                        anime.setDescription(jsonObject.getString("description"));
                        anime.setRating(jsonObject.getString("Rating"));
                        anime.setCategorie(jsonObject.getString("categorie"));
                        anime.setStudio(jsonObject.getString("studio"));
                        anime.setImage_url(jsonObject.getString("img"));
                        anime.setLink(jsonObject.getString("link"));
                        anime.setDrm_scheme(jsonObject.getString("drm_scheme"));
                        anime.setDrm_license_url(jsonObject.getString("drm_license_url"));
                        anime.setDrm(jsonObject.getString("drm"));
                        anime.setSubtitle(jsonObject.getString("subtitle"));
                        anime.setSubtitle1(jsonObject.getString("subtitle1"));
                        anime.setSubtitle2(jsonObject.getString("subtitle2"));
                        lstAnime.add(anime);

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }


                }

                setuprecyclerview(lstAnime);

            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

            }
        });


        requestQueue = Volley.newRequestQueue(Main3Activity.this);
        requestQueue.add(request) ;


    }

    private void setuprecyclerview(List<Anime> lstAnime) {


        RecyclerViewLiveAdapter myadapter = new RecyclerViewLiveAdapter(this,lstAnime) ;
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(myadapter);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_item,menu);

        MenuItem searchItem =menu.findItem(R.id.action_search);
        SearchView searchView = (SearchView) searchItem.getActionView();
        SearchManager searchManager=(SearchManager) getSystemService(Context.SEARCH_SERVICE);
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        searchView.setIconifiedByDefault(false);
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                newText=newText.toLowerCase();
                List<Anime> myList=new ArrayList<>();
                for (Anime anime:lstAnime){
                    String moviename =anime.getName().toLowerCase();
                    if (moviename.contains(newText))
                        myList.add(anime);
                }
                adapter.setSearchOperation(myList);
                return false;
            }
        });
        return true;

    }
}

Related part in my RecyclerViewAdapter;

public void setSearchOperation(List<Anime> newList) {
    mData=new ArrayList<>();
    mData.addAll(newList);
    notifyDataSetChanged();
}

My searchable.xml in res/xml;

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/app_name"
    android:hint="@string/search" >
</searchable>

Related part of Main3Activity in AndroidManifest.xml;

  <activity android:name=".activities.Main3Activity">
        <meta-data
            android:name="android.app.searchable"
            android:resource="@xml/searchable"
            android:value=".activities.Main3Activity"/>
            <intent-filter>
                <action android:name="android.intent.action.SEARCH"/>
            </intent-filter>
        </activity>

And this is the toolbar's layout in layouts which is called by RecyclerView's layout like this "include layout ="@layout/toolbar_layout">

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/toolbar"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="@color/colorPrimary"
    android:theme="@style/ThemeOverlay.AppCompat.Dark"></android.support.v7.widget.Toolbar>

And this is the menu_item xml file in menu folder;

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">


    <item

        android:id="@+id/action_search"
        android:icon="@drawable/ic_action_search"
        android:title="Search Test"
        app:actionViewClass="android.support.v7.widget.SearchView"
        app:showAsAction="ifRoom|collapseActionView"/>
</menu>

I don't use pro-guard so it's not the case and I always used app:showAsAction and app:actionViewClass but as I said all I get that nullpointerexception on same line,thanks in advance!

Geno Chen
  • 4,916
  • 6
  • 21
  • 39
Efkan G
  • 103
  • 1
  • 8

2 Answers2

1

Replace your initialization of SearchView with this line

SearchView searchView = new SearchView(this.getSupportActionBar().getThemedContext());
Abhay Tomar
  • 175
  • 1
  • 9
  • Replaced these two lines MenuItem searchItem =menu.findItem(R.id.action_search); SearchView searchView = (SearchView) searchItem.getActionView(); with this menu.findItem(R.id.action_search).setActionView(searchView); SearchView searchView = new SearchView(this.getSupportActionBar().getThemedContext()); now it gives an error starts with "Process: com.demotxt.myapp.myapplication, PID: 15071 java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v4/graphics/drawable/DrawableWrapper;" – Efkan G Mar 12 '19 at 09:08
  • @EfkanEfkan Woked ? – Abhay Tomar Mar 12 '19 at 09:09
  • No,as I said throws another error after replacement like this: https://ibb.co/vxyBm6f – Efkan G Mar 12 '19 at 09:13
  • @EfkanEfkan try upgrading your support library to latest – Abhay Tomar Mar 12 '19 at 09:40
  • Already did and it worked but the problem is when I click on ic_action_search it doesn't get the keyboard or shows the input ? What did go wrong ? – Efkan G Mar 12 '19 at 09:45
0

Replace:

SearchView searchView = (SearchView) searchItem.getActionView();

With:

MenuItem searchItem =menu.findItem(R.id.action_search);
mSearchView = (SearchView) MenuItemCompat.getActionView(searchItem);

Also make sure your menu.xml file should look like below:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:yourapp="http://schemas.android.com/apk/res-auto" >
    <item android:id="@+id/action_search"
      android:title="@string/action_search"
      android:icon="@drawable/action_search"
      yourapp:showAsAction="always|collapseActionView"
      yourapp:actionViewClass="android.support.v7.widget.SearchView" />
</menu>
kgandroid
  • 5,507
  • 5
  • 39
  • 69