Note: A limiting workaround from another, similar SO question's answer worked for me, but I am interested in finding a true solution. The workaround was to add this to my Activity:
@Override
protected void onSaveInstanceState(Bundle outState) { /* do nothing */ }
But I would still like to leave this question open in hopes for finding a better solution.
My app crashes when it rotates on the latest Android (Marshmallow, Lollipop), but it works on KitKat. In the Spinner onClick method, I get the first child of the parent, which is the first textview in the dropdown list (aka spinner). It works just fine when I do not rotate it. Also, when I comment-out that line that throws the NullPointerException, it works just fine too. So that is the only cause of the problem.
I know it is Null, but I don't understand why, or how to fix it? Also, please note that I cannot use XML for this, because the text color is only known dynamically at runtime. Also, I want the minimum API to be 15.
I added some debug code, and found out that before rotating, parent
and view
parameters are both not null. But after rotating, view
is null. (But parent
is still not null).
See ****** by the line that has the null pointer exception:
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"/>
OnCreate method:
@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();
}
Log:
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
is referenced to Spinner
, not the item you clicked, you should cast the "view" parameter instead.
@Rock Lee After rotated the layout would be refresh, you should resetup the spinner in some callback function like onConfigurationChanged(Configuration newConfig), Android listview disappears after screen rotation
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With