Java Spinner 中带有字符串数组的 NullPointerException
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/24706170/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
NullPointerException with string-array in Spinner
提问by wakoquacko
First app and so really new at android (played around about a year ago but nothing came of it), decent at programming. Wanting to make sure app renders on a phone, no functionality atm. Compiles fine, no problems there. Push it to my phone and "Unfortunately, Splitr has stopped".
第一个应用程序,所以在 android 上真的很新(大约一年前玩过,但没有任何结果),在编程方面很不错。想要确保应用程序在手机上呈现,没有 atm 功能。编译正常,没有问题。把它推到我的手机上,“很遗憾,Splitr 已停止”。
Edit - added to the MainActivity.java, edits have * before and after (not in actual code) but now it flags
编辑 - 添加到 MainActivity.java,编辑前后都有 *(不是在实际代码中)但现在它标记
adapter.setDropDownViewResource(android.R.layout.activity_main);
// Apply the adapter to the spinner
spinnerSplit.setAdapter(adapter);
saying Error:(18, 36) identifier expected
说 Error:(18, 36) identifier expected
setDropDownViewResource, activity_main and setAdapter all in red
setDropDownViewResource、activity_main 和 setAdapter 都为红色
Android Studio
Moto G - CM11 4.4.4
Android Studio
Moto G - CM11 4.4.4
Here is the code, let me know if I missed anything out.
这是代码,如果我错过了什么,请告诉我。
MainActivity.java
主活动.java
package com.hydr0dr4gon.splitrv2;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
*import android.widget.ArrayAdapter;
import android.widget.Spinner;*
public class MainActivity extends Activity {
*Spinner spinnerSplit = (Spinner) findViewById(R.id.spinner);
// Create an ArrayAdapter using the string array and a default spinner layout
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
R.array.arraySplitr, android.R.layout.simple_spinner_item);
// Specify the layout to use when the list of choices appears
adapter.setDropDownViewResource(android.R.layout.activity_main);
// Apply the adapter to the spinner
spinnerSplit.setAdapter(adapter);*
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
SplitrDialogFragment.java
SplitrDialogFragment.java
package com.hydr0dr4gon.splitrv2;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.os.Bundle;
public class SplitrDialogFragment extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use the Builder class for convenient dialog construction
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage(R.string.dialog_split_pay)
.setNegativeButton(R.string.OK, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
// User cancelled the dialog
}
});
// Create the AlertDialog object and return it
return builder.create();
}
}
Strings.xml
字符串.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Splitr</string>
<string name="hello_world">Hello world!</string>
<string name="action_settings">Settings</string>
<string name="btnSplit">Split</string>
<string name="btnTip">+ Tip</string>
<string name="txtSplit">Split By</string>
<string name="txtHint">Enter Bill Total</string>
<string name="spinnerSplit">No. of People</string>
<string name="dialog_split_pay">Each Person Pays</string>
<string name="OK">OK</string>
<array name="arraySplitr">
<item>2</item>
<item>3</item>
<item>4</item>
<item>5</item>
<item>6</item>
<item>7</item>
<item>8</item>
<item>9</item>
<item>10</item>
</array>
actvity_main.xml
活动_main.xml
RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.hydr0dr4gon.splitr.MainActivity">
<TableLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true"
android:paddingLeft="40dp"
android:paddingTop="80dp"
android:paddingRight="40dp"
android:paddingBottom="80dp">
<TableRow
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_span="2"
android:inputType="number"
android:ems="10"
android:id="@+id/editText"
android:layout_column="0"
android:layout_weight="1.5"
android:hint="@string/txtHint" />
</TableRow>
<TableRow
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:text="@string/txtSplit"
android:id="@+id/txtSplit"
android:layout_weight="1"
android:textSize="32dp"
android:textAlignment="center"
android:gravity="center" />
<Spinner
android:layout_width="0dp"
android:layout_height="match_parent"
android:id="@+id/spinner"
android:layout_weight="1"
android:spinnerStyle="@android:style/Widget.Spinner.DropDown"
android:textAlignment="center"
android:entries="@array/arraySplitr"
android:prompt="@string/spinnerSplit"/>
</TableRow>
<TableRow
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@string/btnTip"
android:id="@+id/btnTip"
android:layout_weight="1" />
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@string/btnSplit"
android:id="@+id/btnSplit"
android:layout_weight="1" />
</TableRow>
</TableLayout>
logcat
日志猫
> 07-11 21:18:50.899 10290-10290/com.hydr0dr4gon.splitrv2 D/ActivityThread﹕ handleBindApplication:com.hydr0dr4gon.splitrv2
07-11 21:18:50.899 10290-10290/com.hydr0dr4gon.splitrv2 D/ActivityThread﹕ setTargetHeapUtilization:0.75
07-11 21:18:50.899 10290-10290/com.hydr0dr4gon.splitrv2 D/ActivityThread﹕ setTargetHeapMinFree:2097152
07-11 21:18:51.198 10290-10290/com.hydr0dr4gon.splitrv2 D/AndroidRuntime﹕ Shutting down VM
07-11 21:18:51.206 10290-10290/com.hydr0dr4gon.splitrv2 E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.hydr0dr4gon.splitrv2, PID: 10290
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:394)
at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362)
at android.widget.AbsSpinner.onMeasure(AbsSpinner.java:193)
at android.widget.Spinner.onMeasure(Spinner.java:482)
at android.view.View.measure(View.java:16521)
at android.widget.TableRow.getColumnsWidths(TableRow.java:312)
at android.widget.TableLayout.findLargestCells(TableLayout.java:508)
at android.widget.TableLayout.measureVertical(TableLayout.java:473)
at android.widget.TableLayout.onMeasure(TableLayout.java:439)
at android.view.View.measure(View.java:16521)
at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:719)
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:455)
at android.view.View.measure(View.java:16521)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at android.view.View.measure(View.java:16521)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:327)
at android.view.View.measure(View.java:16521)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2552)
at android.view.View.measure(View.java:16521)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1912)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1109)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1291)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:996)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5600)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
at android.view.Choreographer.doCallbacks(Choreographer.java:574)
at android.view.Choreographer.doFrame(Choreographer.java:544)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5137)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:611)
Thanks.
谢谢。
采纳答案by matiash
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:394)
at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362)
at android.widget.AbsSpinner.onMeasure(AbsSpinner.java:193)
at android.widget.Spinner.onMeasure(Spinner.java:482)
This tells you that the error was measuring the Spinner
. More exactly, one of the strings that should be displayed inside it is null.
这告诉您错误是测量Spinner
. 更确切地说,应该在其中显示的字符串之一为空。
The most likely cause is a problem with the @array/arraySplitr
resource. Is it a valid string-array
resource as defined in the documentation?
最可能的原因是@array/arraySplitr
资源有问题。它是文档中定义的有效string-array
资源吗?
This:
这个:
<array name="arraySplitr">
<item>2</item>
...
should be instead:
应该是:
<string-array name="arraySplitr">
<item>2</item>
...
The array
element is for Typed Arrays. String arrays must use string-array
.
该array
元素用于Typed Arrays。字符串数组必须使用string-array
.
回答by JustWannaFly
Your logcat has a NullPointerException.
您的 logcat 有一个 NullPointerException。
E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.hydr0dr4gon.splitrv2, PID: 10290 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:394)
E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.hydr0dr4gon.splitrv2, PID: 10290 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:394)
Something is not initialized. From your code I cannot see what it would be. Do you have an ArrayAdapter and if so you you initialize it and all the objects it contains? Or is your table just filled by your layout file? I would start looking at how your table is filled (based on the logcat) but I can't see specifically what the problem would be from the code you posted.
有些东西没有初始化。从你的代码我看不出它会是什么。你有一个 ArrayAdapter,如果有,你初始化它和它包含的所有对象吗?或者您的表格只是由您的布局文件填充?我将开始查看您的表格是如何填充的(基于 logcat),但我无法从您发布的代码中具体看出问题是什么。