Android NullPointerException – El parámetro Spinner onItemSelected `view` es nulo después de girar

Nota: Una solución de limitación de otra respuesta similar de la pregunta de SO funcionó para mí, pero estoy interesado en encontrar una solución verdadera. La solución fue agregar esto a mi Actividad:

@Override protected void onSaveInstanceState(Bundle outState) { /* do nothing */ } 

Pero todavía me gustaría dejar esta pregunta abierta con la esperanza de encontrar una mejor solución.


Mi aplicación se bloquea cuando gira en el último Android (Marshmallow, Lollipop), pero funciona en KitKat. En el método Spinner onClick, obtengo el primer hijo del padre, que es el primer texto en la lista desplegable (también conocido como spinner). Funciona muy bien cuando no la giro. Además, cuando comento la línea que lanza la excepción NullPointer, funciona bien. Esa es la única causa del problema.

Sé que es Nulo, pero no entiendo por qué, o cómo solucionarlo? Además, tenga en cuenta que no puedo utilizar XML para esto, porque el color del texto sólo se conoce dinámicamente en tiempo de ejecución. Además, quiero que la API mínima sea 15.

Añadí algún código de depuración y descubrí que antes de girar, los parámetros parent y view no son nulos. Pero después de girar, la view es nula. (Pero el parent todavía no es nulo).

Vea ****** por la línea que tiene la excepción de puntero nulo:

 private void setUpSpinner(int accentColor, final int backgroundColor, Toolbar toolbar) { Spinner spinner = (Spinner) findViewById(R.id.spinner); //Get rid of the normal toolbar's title, because the spinner is replacing the title. getSupportActionBar().setDisplayShowTitleEnabled(false); //Set the choices on the spinner by setting the adapter. spinner.setAdapter(new SpinnerAdapter(toolbar.getContext(), new String[]{"Overview", "Story", "Specifications", "Poll", "Video"}, accentColor, backgroundColor)); //Set the listener for when each option is clicked. spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { Log.e("ITEM SELECTED", "SPINNER" + Integer.toString(position)); //This is necessary to set the color of the "action bar title." (Really, this is just //changing the text color of the spinner when it is at rest; or changing the selected //option's color.) ****************((TextView) view).setTextColor(backgroundColor); //Change the contents of the DealPage depending on what option was selected in the spinner. // CODE OMITTED } @Override public void onNothingSelected(AdapterView<?> parent) { } }); } 

Spinner_item.xml:

 <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/text1" android:layout_width="match_parent" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceListItemSmall" android:gravity="center_vertical" android:padding="5dp" android:minHeight="?android:attr/listPreferredItemHeightSmall"/> 

Método OnCreate:

  @Override protected void onCreate(Bundle savedInstanceState) { context = this; RealmDatabase.setRealmInstance(this); //----------- UNPACK EXTRAS ----------- String date = getIntent().getExtras().getString(KeyStrings.EXTRA_DATE); //---------------- PREREQUISITE INITIALIZATION ---------- super.onCreate(savedInstanceState); setContentView(R.layout.activity_deal_page); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_with_spinner); setSupportActionBar(toolbar); //------------ Enable "UP" navigation --------------- getSupportActionBar().setDisplayHomeAsUpEnabled(true); getDataFromDatabase(date); //----------------- THEMES AND COLORS ------------------ //Set up colors final int backgroundColor = this.deal.getTheme().getBackgroundColor().getColor(); final int accentColor = this.deal.getTheme().getAccentColor().getColor(); String themeForeground = this.deal.getTheme().getForeground(); final int foreground = generateForegroundColor(themeForeground); final String foregroundWebView = generateForegroundWebViewString(themeForeground); // This is necessary because HTML does not have an alpha channel. //Set toolbar colors toolbar.setBackgroundColor(accentColor); toolbar.setTitleTextColor(backgroundColor); //Set Page Background Color RelativeLayout dealPageBackground = (RelativeLayout) findViewById(R.id.deal_page_background); dealPageBackground.setBackgroundColor(backgroundColor); //----------- INITIALIZE THE ACTUAL DEAL PAGE STUFF ---------------- //Title TextView title = (TextView) findViewById(R.id.title); title.setText(this.deal.getTitle()); title.setTextColor(foreground); //Price TextView price = (TextView) findViewById(R.id.price); NumberFormat fmt = NumberFormat.getCurrencyInstance(); price.setText(fmt.format(this.deal.getItems().first().getPrice())); price.setTextColor(foreground); //ViewInBrowser setUpViewInBrowserButton(backgroundColor, accentColor); AndDown andDown = new AndDown(); //Set up "linkColorHTML" String linkColorHTML = generateLinkColorHTML(accentColor); //Features setUpFeaturesView(andDown, backgroundColor, linkColorHTML, foregroundWebView); //More Specs button setUpMoreSpecsButton(backgroundColor, foreground, (Spinner) findViewById(R.id.spinner)); //Story Title TextView storyTitle = (TextView) findViewById(R.id.story_title); storyTitle.setText(this.deal.getStory().getTitle()); storyTitle.setTextColor(accentColor); //Story Body setUpStoryBody(andDown, backgroundColor, linkColorHTML, foregroundWebView); //Specs Title TextView specsTitle = (TextView) findViewById(R.id.specs_title); specsTitle.setText(this.deal.getTitle()); specsTitle.setTextColor(accentColor); //Specs setUpSpecificationsView(andDown, backgroundColor, linkColorHTML, foregroundWebView); //Set up ViewPager ViewPager viewPager = (ViewPager) findViewById(R.id.photos_view_pager); viewPager.setAdapter(new PhotoPagerAdapter(this, this.deal.getPhotos())); //Set up spinner setUpSpinner(accentColor, backgroundColor, toolbar); //Set up poll title TextView pollTitle = (TextView) findViewById(R.id.poll_title); pollTitle.setText(this.poll.getTitle()); pollTitle.setTextColor(accentColor); //Set up poll view-forum-topic-in-browser button setUpViewForumTopicInBrowserButton(backgroundColor, accentColor); //Set up poll setUpPoll(foreground, accentColor); //Set up video title TextView videoTitle = (TextView) findViewById(R.id.video_title); videoTitle.setText(this.video.getTitle()); videoTitle.setTextColor(accentColor); //Set up video view-forum-topic-in-browser button setUpViewVideoForumTopicInBrowserButton(backgroundColor, accentColor); //Set up youtube video setUpYoutubeVideo(); } 

Iniciar sesión:

 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: FATAL EXCEPTION: main 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: Process: com.example.meh, PID: 6507 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setTextColor(int)' on a null object reference 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at com.example.meh.Deal.DealPage$6.onItemSelected(DealPage.java:480) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.widget.AdapterView.fireOnSelected(AdapterView.java:897) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.widget.AdapterView.selectionChanged(AdapterView.java:884) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.widget.AdapterView.checkSelectionChanged(AdapterView.java:1047) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.widget.AdapterView.handleDataChanged(AdapterView.java:1027) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.widget.AbsSpinner.onMeasure(AbsSpinner.java:184) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.widget.Spinner.onMeasure(Spinner.java:507) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.support.v7.widget.AppCompatSpinner.onMeasure(AppCompatSpinner.java:410) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.view.View.measure(View.java:17430) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.support.v7.widget.Toolbar.measureChildCollapseMargins(Toolbar.java:1225) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.support.v7.widget.Toolbar.onMeasure(Toolbar.java:1333) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.view.View.measure(View.java:17430) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.widget.LinearLayout.measureVertical(LinearLayout.java:722) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.widget.LinearLayout.onMeasure(LinearLayout.java:613) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.view.View.measure(View.java:17430) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.widget.FrameLayout.onMeasure(FrameLayout.java:430) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.support.v7.internal.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:124) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.view.View.measure(View.java:17430) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.widget.LinearLayout.measureVertical(LinearLayout.java:722) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.widget.LinearLayout.onMeasure(LinearLayout.java:613) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.view.View.measure(View.java:17430) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.widget.FrameLayout.onMeasure(FrameLayout.java:430) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.view.View.measure(View.java:17430) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.widget.LinearLayout.measureVertical(LinearLayout.java:722) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.widget.LinearLayout.onMeasure(LinearLayout.java:613) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.view.View.measure(View.java:17430) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.widget.FrameLayout.onMeasure(FrameLayout.java:430) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2560) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.view.View.measure(View.java:17430) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2001) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1767) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1054) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5779) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.view.Choreographer.doCallbacks(Choreographer.java:580) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.view.Choreographer.doFrame(Choreographer.java:550) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:739) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.os.Looper.loop(Looper.java:135) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5221) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:372) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)f 

 public void onItemSelected(AdapterView<?> parent, View view, int position, long id) 

adapterView se hace referencia a Spinner , no el elemento que hizo clic, debe emitir el parámetro "ver" en su lugar.


@Rock Lee Después de rotar el diseño se actualizaría, debe restablecer el hilandero en alguna función de devolución de llamada como onConfigurationChanged (Configuration newConfig), Android listview desaparece después de la rotación de la pantalla

Puede utilizar el método override onSaveInstanceState () y onRestoreInstanceState (). O para dejar de llamar onCreate () en la rotación de la pantalla sólo tiene que añadir esta línea en su manifiesto xml android: configChanges = "keyboardHidden | orientation"

Nota: su clase personalizada debe implementar ejemplo Parcelable a continuación.

 @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putParcelable("obj", myClass); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onRestoreInstanceState(savedInstanceState); myClass=savedInstanceState.getParcelable("obj")); } public class MyClass implements Parcelable { private int mData; public int describeContents() { return 0; } /** save object in parcel */ public void writeToParcel(Parcel out, int flags) { out.writeInt(mData); } public static final Parcelable.Creator<MyParcelable> CREATOR = new Parcelable.Creator<MyParcelable>() { public MyParcelable createFromParcel(Parcel in) { return new MyParcelable(in); } public MyParcelable[] newArray(int size) { return new MyParcelable[size]; } }; /** recreate object from parcel */ private MyParcelable(Parcel in) { mData = in.readInt(); } } 
  • NullPointerException en getReseources () Bitmap Array
  • El interruptor se bloquea cuando se hace clic en Android 5.0
  • Android NullPointerException al ejecutar la consulta en la base de datos SQLite
  • MapFragment que causa NullPointerException en el método getMapAsync (this)
  • La inspección muestra la excepción de puntero nulo mientras compruebo la probabilidad nula
  • Fragmento de Android: findViewById devuelve null
  • Cómo pasar el contexto de la aplicación dentro Singleton y SharedPreferences Clases
  • NullPointerException: int android.support.v4.app.FragmentManagerImpl.mCurState Referencia de objeto null
  • Nullpointerexception en getView de ArrayAdapter personalizado
  • NullPointerException en android.support.v7.app.ActionBarImplICS.getThemedContext Android
  • getActivity (). findViewById (R.layout.contacts_list_view) devuelve null
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.