Why assigns an OnClickListener to an AutoCompleteTextView by throwing a NullPointerException?

Whenever I assign the android: onClick attribute to an AutoCompleteTextView, my application crashes immediately after the activity loads. I tested AutoCompleteTextView without assigning the onClick method, and it seems to work just fine, like assigning onClick to other views (including EditText, Spinners, TextViews, Buttons and ImageButtons). I managed to narrow the error to line 24 (setContentView (R.layout.activity_main)). Can anyone shed some light on this?

MainActivity.java

package com.example.matt.testapp; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; public class MainActivity extends AppCompatActivity { public AutoCompleteTextView actv; public String[] continents = {"North America", "South America", "Antarctica", "Europe", "Africa", "Asia", "Australia" }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); actv = (AutoCompleteTextView) findViewById(R.id.actv); ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, continents); actv.setAdapter(adapter); } public void actvClick (View view) {} } 

activity_main.xml

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="match_parent" android:layout_width="match_parent" > <AutoCompleteTextView android:id="@+id/actv" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="actvClick" > </AutoCompleteTextView> </LinearLayout> 

Logcat

 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.matt.testapp/com.example.matt.testapp.MainActivity}: android.view.InflateException: Binary XML file line #7: Binary XML file line #7: Error inflating class AutoCompleteTextView at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892) at android.app.ActivityThread.-wrap11(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593) at android.os.Handler.dispatchMessage(Handler.java:105) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6541) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) Caused by: android.view.InflateException: Binary XML file line #7: Binary XML file line #7: Error inflating class AutoCompleteTextView Caused by: android.view.InflateException: Binary XML file line #7: Error inflating class AutoCompleteTextView Caused by: java.lang.NullPointerException: Attempt to write to field 'android.view.View$OnClickListener android.widget.AutoCompleteTextView$PassThroughClickListener.mWrapped' on a null object reference at android.widget.AutoCompleteTextView$PassThroughClickListener.-set0(Unknown Source:0) at android.widget.AutoCompleteTextView.setOnClickListener(AutoCompleteTextView.java:307) at android.view.View.<init>(View.java:5008) at android.widget.TextView.<init>(TextView.java:824) at android.widget.EditText.<init>(EditText.java:88) at android.widget.AutoCompleteTextView.<init>(AutoCompleteTextView.java:220) at android.widget.AutoCompleteTextView.<init>(AutoCompleteTextView.java:193) at android.widget.AutoCompleteTextView.<init>(AutoCompleteTextView.java:172) at android.support.v7.widget.AppCompatAutoCompleteTextView.<init>(AppCompatAutoCompleteTextView.java:68) at android.support.v7.widget.AppCompatAutoCompleteTextView.<init>(AppCompatAutoCompleteTextView.java:64) at android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:130) at android.support.v7.app.AppCompatDelegateImplV9.createView(AppCompatDelegateImplV9.java:1026) at android.support.v7.app.AppCompatDelegateImplV9.onCreateView(AppCompatDelegateImplV9.java:1083) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:772) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730) at android.view.LayoutInflater.rInflate(LayoutInflater.java:863) at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824) at android.view.LayoutInflater.inflate(LayoutInflater.java:515) at android.view.LayoutInflater.inflate(LayoutInflater.java:423) at android.view.LayoutInflater.inflate(LayoutInflater.java:374) at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:289) at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:139) at com.example.matt.testapp.MainActivity.onCreate(MainActivity.java:24) at android.app.Activity.performCreate(Activity.java:6975) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892) at android.app.ActivityThread.-wrap11(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593) at android.os.Handler.dispatchMessage(Handler.java:105) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6541) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 
0
source share
1 answer

This seems like an error in AutoCompleteTextView .

What's happening:

  • XML inflation calls the AutoCompleteTextView constructor and calls the View constructor. Constructor
  • View sees the onClick attribute and calls setOnClickListener() .
  • AutoCompleteTextView overrides setOnClickListener() , which is written to the mPassThroughClickListener internal field. It is initialized only at the end of the AutoCompleteTextView constructor, and this initialization code has not yet been run.

Link

To get around this, remove onClick attrtibute from your XML and call setOnClickListener() programmatically in your code.

I registered an error about this in the tracker on the Android issue.

0
source

Source: https://habr.com/ru/post/1495804/


All Articles