Parth Vora Parth Vora - 1 month ago 7
Android Question

searchView.setSearchableInfo(searchInfo) gives NPE every time and cannot find cause

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);

MenuItem searchItem = menu.findItem(R.id.menu_search);
android.widget.SearchView searchView = (android.widget.SearchView) searchItem.getActionView();

SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchableInfo searchInfo = searchManager.getSearchableInfo(getComponentName());
if(searchInfo != null) {
searchView.setSearchableInfo(searchInfo);
}
//searchView.setIconifiedByDefault(false);

return true;
}


This is the menu create code where I have put
searchView.setSearchableInfo(searchInfo)
but gives me NPE error.

Full Stack Trace:

11-25 13:53:15.223 1693-1693/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.NullPointerException
at vt.parthvora.task5maps.MapsActivity.onCreateOptionsMenu(MapsActivity.java:221)
at android.app.Activity.onCreatePanelMenu(Activity.java:2505)
at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:262)
at android.support.v7.internal.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:85)
at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.onCreatePanelMenu(AppCompatDelegateImplBase.java:241)
at android.support.v7.app.AppCompatDelegateImplV7.preparePanel(AppCompatDelegateImplV7.java:1247)
at android.support.v7.app.AppCompatDelegateImplV7.doInvalidatePanelMenu(AppCompatDelegateImplV7.java:1527)
at android.support.v7.app.AppCompatDelegateImplV7.access$100(AppCompatDelegateImplV7.java:90)
at android.support.v7.app.AppCompatDelegateImplV7$1.run(AppCompatDelegateImplV7.java:128)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5041)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
at dalvik.system.NativeStart.main(Native Method)

Answer

try this code to setup search view. i copy pasted this code from one of my project. you can replace AutoCompleteTextView with EditText or what ever you want

menu_main.xml

xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="audioplayer.ui.MainActivity">
<item
    android:id="@+id/action_search"
    android:orderInCategory="100"
    android:title="@string/action_search"
    android:icon="@drawable/search"
    app:showAsAction="always|collapseActionView" />
</menu>

put this code in your main activity

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

        MenuItem menuItem = menu.getItem(0).setActionView(R.layout.search_view);
        search = (AutoCompleteTextView) menuItem.getActionView().findViewById(
                R.id.search_txt);
        search.setFocusableInTouchMode(true);
        search.requestFocus();
        final ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                MainActivity.this, android.R.layout.simple_list_item_1,
                songNames);
        search.setAdapter(adapter);

        search.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                                    long arg3) {
                // TODO Auto-generated method stub
                InputMethodManager in = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);

                in.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);
                // do what ever you want

            }
        });
        search.setOnEditorActionListener(new TextView.OnEditorActionListener() {

            @Override
            public boolean onEditorAction(TextView view, int actionId,
                                          KeyEvent event) {
                // TODO Auto-generated method stub
                if (actionId == EditorInfo.IME_ACTION_GO) {

                    if (search.getText().toString().length() > 0) {
                        startActivity(new Intent(MainActivity.this,
                                SearchActivity.class).putExtra("keyword",
                                search.getText().toString()));
                        overridePendingTransition(R.anim.slide_in_left,
                                R.anim.slide_out_left);
                        return true;
                    }

                }
                return false;
            }
        });

        ImageView imgClear = (ImageView) menuItem.getActionView().findViewById(
                R.id.clear_search);
        imgClear.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                search.setText("");
                InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                im.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT,
                        InputMethodManager.HIDE_IMPLICIT_ONLY);
            }
        });
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_search:
                InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                im.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT,
                        InputMethodManager.HIDE_IMPLICIT_ONLY);
                break;
        }
        return super.onOptionsItemSelected(item);
    }

here is my search_view layout

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/primary">

        <AutoCompleteTextView
            android:id="@+id/search_txt"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_margin="@dimen/five_dp"
            android:drawableLeft="@drawable/abc_ic_search_api_mtrl_alpha"
            android:ems="10"
            android:hint="@string/action_search"
            android:imeOptions="actionGo"
            android:inputType="textAutoComplete"
            android:singleLine="true"
            android:visibility="visible" />


        <ImageButton
            android:id="@+id/clear_search"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentEnd="true"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:focusable="true"
            android:background="@drawable/button_selector"
            android:layout_margin="@dimen/five_dp"
            android:padding="5dp"
            android:src="@drawable/abc_ic_clear_mtrl_alpha"
            android:visibility="visible" />

    </RelativeLayout>
</RelativeLayout>