Android NullPointerException - Spinner onItemSelected `view` 参数在旋转后为空 [英] Android NullPointerException - Spinner onItemSelected `view` parameter is null after rotating
问题描述
注意:另一个类似的 SO 问题的答案的限制性解决方法对我有用,但我很感兴趣寻找真正的解决方案.解决方法是将其添加到我的活动中:
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.
我的应用在最新的 Android(棉花糖、棒棒糖)上旋转时崩溃,但它在 KitKat 上运行.在 Spinner onClick 方法中,我得到了父级的第一个子级,它是下拉列表中的第一个文本视图(又名微调器).当我不旋转它时它工作得很好.此外,当我注释掉抛出 NullPointerException 的那一行时,它也能正常工作.所以这是问题的唯一原因.
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.
我知道它是 Null,但我不明白为什么,或者如何解决它?另外,请注意我不能为此使用 XML,因为文本颜色仅在运行时动态知道.另外,我希望最小 API 为 15.
我添加了一些调试代码,发现在旋转之前,parent
和view
参数都不为空.但旋转后,view
为空.(但 parent
仍然不为 null).
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:
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 方法:
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();
}
日志:
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
被引用到 Spinner
,而不是您点击的项目,您应该转换为view"参数.
adapterView
is referenced to Spinner
, not the item you clicked, you should cast the "view" parameter instead.
@Rock Lee旋转后布局将被刷新,您应该在一些回调函数中重置微调器,例如 onConfigurationChanged(Configuration newConfig),屏幕旋转后Android列表视图消失
@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
这篇关于Android NullPointerException - Spinner onItemSelected `view` 参数在旋转后为空的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!