I have a problem, very annoying problem, and I have absolutely no idea what is causing it! I am trying to make an Android application capable of reading an XML file, adding some data from the XML file to an ArrayList, and then putting the ArrayList in a Spinner. Here is part of my Shortcuts class.
Shortcuts.java
Spinner selection = (Spinner) findViewById(R.id.shortcutsSpinner); //Defining the Spinner
/*ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
this, R.array.shortcut_selection, android.R.layout.simple_spinner_item); //Defining the items in the Spinner
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
selection.setAdapter(adapter); //Setting the items to the Spinner*/
ArrayList<String> items;
try {
items = scanner.getCategorys();
} catch (FileNotFoundException e) {
items = null;
e.printStackTrace();
} catch (XmlPullParserException e) {
items = null;
e.printStackTrace();
} catch (IOException e) {
items = null;
e.printStackTrace();
}
@SuppressWarnings({ "unchecked", "rawtypes" })
ArrayAdapter<CharSequence> adapter = new ArrayAdapter(this,android.R.layout.simple_spinner_item, items);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
selection.setAdapter(adapter);
selection.setOnItemSelectedListener(new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
final String simulatorCommands = getString(R.string.Simulator_Commands); //Setting Shortcuts
final String controlSurfaceCommands = getString(R.string.Control_Surface_Commands);
TextView Text = (TextView)findViewById(R.id.shortcutsText); //Defining the TextView
Spinner selection = (Spinner) findViewById(R.id.shortcutsSpinner); //Defining the Spinner
Here is part of my Scanner class
Scanner.java
public ArrayList<String> getCategorys() throws XmlPullParserException, IOException {
ArrayList<String> categorys = new ArrayList<String>();
categorys.add("Please select a category");
//START ADDING HERE
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser parser = factory.newPullParser();
File file = new File(Environment.getExternalStorageDirectory()+ "/fsx_kneeboard/categories.xml");
FileInputStream fis = new FileInputStream(file);
parser.setInput(new InputStreamReader(fis));
parser.next();
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_TAG && parser.getName().equals("name")) {
categorys.add(parser.getText());
}
parser.next();
eventType = parser.getEventType();
}
return categorys;
}
I can get into the Scanner activity, but when I try to open the Spinner, I get a force close, and this in the logcat.
04-09 17:30:56.452: D/AndroidRuntime(9980): Shutting down VM
04-09 17:30:56.452: W/dalvikvm(9980): threadid=1: thread exiting with uncaught exception (group=0x4001d7e8)
04-09 17:30:56.482: E/AndroidRuntime(9980): FATAL EXCEPTION: main
04-09 17:30:56.482: E/AndroidRuntime(9980): java.lang.NullPointerException
04-09 17:30:56.482: E/AndroidRuntime(9980): at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:355)
04-09 17:30:56.482: E/AndroidRuntime(9980): at android.widget.ArrayAdapter.getDropDownView(ArrayAdapter.java:376)
04-09 17:30:56.482: E/AndroidRuntime(9980): at android.widget.Spinner$DropDownAdapter.getDropDownView(Spinner.java:329)
04-09 17:30:56.482: E/AndroidRuntime(9980): at android.widget.Spinner$DropDownAdapter.getView(Spinner.java:325)
04-09 17:30:56.482: E/AndroidRuntime(9980): at android.widget.AbsListView.obtainView(AbsListView.java:1294)
04-09 17:30:56.482: E/AndroidRuntime(9980): at android.widget.ListView.measureHeightOfChildren(ListView.java:1198)
04-09 17:30:56.482: E/AndroidRuntime(9980): at android.widget.ListView.onMeasure(ListView.java:1109)
04-09 17:30:56.482: E/AndroidRuntime(9980): at android.view.View.measure(View.java:8171)
04-09 17:30:56.482: E/AndroidRuntime(9980): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
04-09 17:30:56.482: E/AndroidRuntime(9980): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1012)
04-09 17:30:56.482: E/AndroidRuntime(9980): at android.widget.LinearLayout.measureVertical(LinearLayout.java:381)
04-09 17:30:56.482: E/AndroidRuntime(9980): at android.widget.LinearLayout.onMeasure(LinearLayout.java:304)
04-09 17:30:56.482: E/AndroidRuntime(9980): at android.view.View.measure(View.java:8171)
04-09 17:30:56.482: E/AndroidRuntime(9980): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
04-09 17:30:56.482: E/AndroidRuntime(9980): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1012)
04-09 17:30:56.482: E/AndroidRuntime(9980): at android.widget.LinearLayout.measureVertical(LinearLayout.java:381)
04-09 17:30:56.482: E/AndroidRuntime(9980): at android.widget.LinearLayout.onMeasure(LinearLayout.java:304)
04-09 17:30:56.482: E/AndroidRuntime(9980): at com.android.internal.widget.WeightedLinearLayout.onMeasure(WeightedLinearLayout.java:60)
04-09 17:30:56.482: E/AndroidRuntime(9980): at android.view.View.measure(View.java:8171)
04-09 17:30:56.482: E/AndroidRuntime(9980): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
04-09 17:30:56.482: E/AndroidRuntime(9980): at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
04-09 17:30:56.482: E/AndroidRuntime(9980): at android.view.View.measure(View.java:8171)
04-09 17:30:56.482: E/AndroidRuntime(9980): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)
04-09 17:30:56.482: E/AndroidRuntime(9980): at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
04-09 17:30:56.482: E/AndroidRuntime(9980): at android.view.View.measure(View.java:8171)
04-09 17:30:56.482: E/AndroidRuntime(9980): at android.view.ViewRoot.performTraversals(ViewRoot.java:801)
04-09 17:30:56.482: E/AndroidRuntime(9980): at android.view.ViewRoot.handleMessage(ViewRoot.java:1727)
04-09 17:30:56.482: E/AndroidRuntime(9980): at android.os.Handler.dispatchMessage(Handler.java:99)
04-09 17:30:56.482: E/AndroidRuntime(9980): at android.os.Looper.loop(Looper.java:123)
04-09 17:30:56.482: E/AndroidRuntime(9980): at android.app.ActivityThread.main(ActivityThread.java:4627)
04-09 17:30:56.482: E/AndroidRuntime(9980): at java.lang.reflect.Method.invokeNative(Native Method)
04-09 17:30:56.482: E/AndroidRuntime(9980): at java.lang.reflect.Method.invoke(Method.java:521)
04-09 17:30:56.482: E/AndroidRuntime(9980): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
04-09 17:30:56.482: E/AndroidRuntime(9980): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
04-09 17:30:56.482: E/AndroidRuntime(9980): at dalvik.system.NativeStart.main(Native Method)
I don’t understand the logcat much, I am new to Java. I know the problem is in this bit of code; when I delete it, the Spinner opens and works showing me ‘Please select a category’.
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_TAG && parser.getName().equals("name")) {
categorys.add(parser.getText());
}
parser.next();
eventType = parser.getEventType();
}
But that code seems clean to me, any help please? Thanks for you time and help, I will be very grateful, zeokila.
Looking at the javadoc
parser.getName()could be null:You could try using this instead:
"name".equals(parser.getName())so that it returns false ifparser.getName()is null.And
int eventType = parser.getEventType();should probably be in your while loop or its value will not update when you callparser.next();.