Binary XML file line # 0: Error inflating class android.widget.SearchView

0

I am using the SearchView component in an application, apparently on some devices it is causing crashes.

What do you think the problem might be and how could you solve it?

This is the SearchView that I have in my XML:

  <SearchView
      android:id="@+id/searchProduct"
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:layout_gravity="center_vertical"
      android:iconifiedByDefault="false"
      android:layout_weight="1"
      android:visibility="gone"
      android:searchIcon="@null"
      android:closeIcon="@null"
    />

My gradle:

    minSdkVersion 15
    targetSdkVersion 27

This is the activity SearchPromotionsActivity: The layout of this Activity contains a toolbar that is actually an XML that I add to the "SearchPromotionsActivity" layout, inside this is the searchView, an imageView with a lupita that opens the searchView, a textView that is the title and an imageView with back button, and finally a RecyclerView.

SearchView searchView;
private boolean pressed = false;
private ImageView imgSearch;
private InputMethodManager imm;

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

    searchView = findViewById(R.id.searchProduct);
    imgSearch = findViewById(R.id.imgSearch);

    imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);

    findViewById(R.id.svOpenSearchView).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            //Lo que hace esto es ocultar un imageView que contiene
            //una imagen de una lupa y muestra el searchView
            //también muestra y oculta el teclado                  
            if(!pressed){
                findViewById(R.id.searchProduct).setVisibility(View.VISIBLE);
                findViewById(R.id.txtSearchPromotions).setVisibility(View.GONE);
                imgSearch.setImageResource(R.drawable.closeblue);
                searchView.requestFocus();
                if(imm!=null){
                    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,InputMethodManager.HIDE_IMPLICIT_ONLY);
                }
                pressed = true;
            }else{
                findViewById(R.id.searchProduct).setVisibility(View.GONE);
                findViewById(R.id.txtSearchPromotions).setVisibility(View.VISIBLE);
                imgSearch.setImageResource(R.drawable.search);
                findViewById(R.id.ly).requestFocus();
                if(imm!=null){
                    imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0);
                }
                pressed = false;
            }
        }
    });


    //Acción del searchView
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            if (query != null) {
                Intent intent = new Intent(SearchPromotionsActivity.this, SearchResultsActivity.class);
                intent.putExtra("query", query);
                if(imm!=null) {
                    imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0);
                }
                startActivity(intent);
                return true;
            }
            return false;

        }

        @Override
        public boolean onQueryTextChange(String newText) {

            return false;
        }
    });

This is log:

    Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{pe.beyond.movistar.prioritymoments/pe.beyond.movistar.prioritymoments.activities.startSection.SearchPromotionsActivity}: android.view.InflateException: Binary XML file line #0: Error inflating class android.widget.SearchView
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2345)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2405)
       at android.app.ActivityThread.access$800(ActivityThread.java:155)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1323)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:135)
       at android.app.ActivityThread.main(ActivityThread.java:5376)
       at java.lang.reflect.Method.invoke(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:372)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)
Caused by android.view.InflateException: Binary XML file line #0: Error inflating class android.widget.SearchView
       at android.view.LayoutInflater.createView(LayoutInflater.java:633)
       at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater.onCreateView(Unknown Source)
       at android.view.LayoutInflater.onCreateView(LayoutInflater.java:682)
       at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater.onCreateView(Unknown Source)
       at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:741)
       at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
       at android.view.LayoutInflater.parseInclude(LayoutInflater.java:916)
       at android.view.LayoutInflater.rInflate(LayoutInflater.java:802)
       at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
       at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater.inflate(Unknown Source)
       at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
       at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
       at android.support.v7.app.AppCompatDelegateImplV9.setContentView(Unknown Source)
       at android.support.v7.app.AppCompatActivity.setContentView(Unknown Source)
       at pe.beyond.movistar.prioritymoments.activities.startSection.SearchPromotionsActivity.onCreate(Unknown Source)
       at android.app.Activity.performCreate(Activity.java:6021)
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2405)
       at android.app.ActivityThread.access$800(ActivityThread.java:155)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1323)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:135)
       at android.app.ActivityThread.main(ActivityThread.java:5376)
       at java.lang.reflect.Method.invoke(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:372)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)
Caused by java.lang.reflect.InvocationTargetException
       at java.lang.reflect.Constructor.newInstance(Constructor.java)
       at java.lang.reflect.Constructor.newInstance(Constructor.java:288)
       at android.view.LayoutInflater.createView(LayoutInflater.java:607)
       at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater.onCreateView(Unknown Source)
       at android.view.LayoutInflater.onCreateView(LayoutInflater.java:682)
       at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater.onCreateView(Unknown Source)
       at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:741)
       at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
       at android.view.LayoutInflater.parseInclude(LayoutInflater.java:916)
       at android.view.LayoutInflater.rInflate(LayoutInflater.java:802)
       at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
       at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater.inflate(Unknown Source)
       at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
       at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
       at android.support.v7.app.AppCompatDelegateImplV9.setContentView(Unknown Source)
       at android.support.v7.app.AppCompatActivity.setContentView(Unknown Source)
       at pe.beyond.movistar.prioritymoments.activities.startSection.SearchPromotionsActivity.onCreate(Unknown Source)
       at android.app.Activity.performCreate(Activity.java:6021)
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2405)
       at android.app.ActivityThread.access$800(ActivityThread.java:155)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1323)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:135)
       at android.app.ActivityThread.main(ActivityThread.java:5376)
       at java.lang.reflect.Method.invoke(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:372)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)
Caused by java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.graphics.drawable.Drawable.setState(int[])' on a null object reference
       at android.widget.SearchView.updateCloseButton(SearchView.java:852)
       at android.widget.SearchView.updateViewsVisibility(SearchView.java:801)
       at android.widget.SearchView.<init>(SearchView.java:367)
       at android.widget.SearchView.<init>(SearchView.java:258)
       at android.widget.SearchView.<init>(SearchView.java:254)
       at java.lang.reflect.Constructor.newInstance(Constructor.java)
       at java.lang.reflect.Constructor.newInstance(Constructor.java:288)
       at android.view.LayoutInflater.createView(LayoutInflater.java:607)
       at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater.onCreateView(Unknown Source)
       at android.view.LayoutInflater.onCreateView(LayoutInflater.java:682)
       at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater.onCreateView(Unknown Source)
       at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:741)
       at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
       at android.view.LayoutInflater.parseInclude(LayoutInflater.java:916)
       at android.view.LayoutInflater.rInflate(LayoutInflater.java:802)
       at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
       at uk.co.chrisjenx.calligraphy.CalligraphyLayoutInflater.inflate(Unknown Source)
       at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
       at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
       at android.support.v7.app.AppCompatDelegateImplV9.setContentView(Unknown Source)
       at android.support.v7.app.AppCompatActivity.setContentView(Unknown Source)
       at pe.beyond.movistar.prioritymoments.activities.startSection.SearchPromotionsActivity.onCreate(Unknown Source)
       at android.app.Activity.performCreate(Activity.java:6021)
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2405)
       at android.app.ActivityThread.access$800(ActivityThread.java:155)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1323)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:135)
       at android.app.ActivityThread.main(ActivityThread.java:5376)
       at java.lang.reflect.Method.invoke(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:372)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)
    
asked by Jorge Requez 16.03.2018 в 16:23
source

1 answer

0

According to the error shown in the Log:

Caused by java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.graphics.drawable.Drawable.setState(int[])' on a null object reference
       at android.widget.SearchView.updateCloseButton(SearchView.java:852)

You can not null it from XML, if you want to hide it try from code with the

mSearchView.setIconified(false);

Hide the Close Button

Using styles:

  

For versions under 21:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="actionBarWidgetTheme">@style/AppTheme.WidgetTheme</item>
</style>

<style name="AppTheme.WidgetTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="searchViewCloseIcon">@android:color/transparent</item>
</style>
  

For versions 21 above:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="searchViewStyle">@style/AppTheme.SearchView</item>
</style>

<style name="AppTheme.SearchView" parent="Widget.AppCompat.SearchView">
    <item name="closeIcon">@android:color/transparent</item>
</style>
    
answered by 19.03.2018 в 16:43