1

我有一个问题,非常烦人的问题,我完全不知道是什么原因造成的!我正在尝试制作一个能够读取 XML 文件的 Android 应用程序,将 XML 文件中的一些数据添加到 ArrayList,然后将 ArrayList 放入 Spinner。这是我的快捷方式课程的一部分。

快捷方式.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

这是我的扫描仪课程的一部分

扫描仪.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;

    }

我可以进入 Scanner 活动,但是当我尝试打开 Spinner 时,我会强制关闭,这在 logcat 中。

04-09 17:30:56.452: D/AndroidRuntime(9980): 关闭 VM 04-09 17:30:56.452: W/dalvikvm(9980): threadid=1: 线程退出未捕获异常 (group=0x4001d7e8) 04 -09 17:30:56.482:E/AndroidRuntime(9980):致命异常:主要 04-09 17:30:56.482:E/AndroidRuntime(9980):java.lang.NullPointerException 04-09 17:30:56.482:E /AndroidRuntime(9980): 在 android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:355) 04-09 17:30:56.482: E/AndroidRuntime(9980): 在 android.widget.ArrayAdapter.getDropDownView(ArrayAdapter.java: 376) 04-09 17:30:56.482: E/AndroidRuntime(9980): 在 android.widget.Spinner$DropDownAdapter.getDropDownView(Spinner.java:329) 04-09 17:30:56.482: E/AndroidRuntime(9980) : 在 android.widget.Spinner$DropDownAdapter.getView(Spinner.java:325) 04-09 17:30:56.482: E/AndroidRuntime(9980):在 android.widget.AbsListView.obtainView(AbsListView.java:1294) 04-09 17:30:56.482: E/AndroidRuntime(9980): 在 android.widget.ListView.measureHeightOfChildren(ListView.java:1198) 04-09 17 :30:56.482: E/AndroidRuntime(9980): 在 android.widget.ListView.onMeasure(ListView.java:1109) 04-09 17:30:56.482: E/AndroidRuntime(9980): 在 android.view.View。测量(View.java:8171)04-09 17:30:56.482:E/AndroidRuntime(9980):在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132)04-09 17:30:56.482:E/ AndroidRuntime(9980): 在 android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1012) 04-09 17:30:56.482: E/AndroidRuntime(9980): 在 android.widget.LinearLayout.measureVertical(LinearLayout.java:381 ) 04-09 17:30:56.482: E/AndroidRuntime(9980): 在 android.widget.LinearLayout。onMeasure(LinearLayout.java:304) 04-09 17:30:56.482: E/AndroidRuntime(9980): 在 android.view.View.measure(View.java:8171) 04-09 17:30:56.482: E/ AndroidRuntime(9980): 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132) 04-09 17:30:56.482: E/AndroidRuntime(9980): 在 android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1012 ) 04-09 17:30:56.482: E/AndroidRuntime(9980): 在 android.widget.LinearLayout.measureVertical(LinearLayout.java:381) 04-09 17:30:56.482: E/AndroidRuntime(9980): 在 android .widget.LinearLayout.onMeasure(LinearLayout.java:304) 04-09 17:30:56.482: E/AndroidRuntime(9980): 在 com.android.internal.widget.WeightedLinearLayout.onMeasure(WeightedLinearLayout.java:60) 04- 09 17:30:56.482: E/AndroidRuntime(9980): 在 android.view.View.measure(View.java:8171) 04-09 17:30:56.482: E/AndroidRuntime(9980): 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132) 04-09 17:30:56.482: E/AndroidRuntime(9980): 在android.widget.FrameLayout.onMeasure(FrameLayout.java:245) 04-09 17:30:56.482: E/AndroidRuntime(9980): 在 android.view.View.measure(View.java:8171) 04-09 17: 30:56.482: E/AndroidRuntime(9980): 在 android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132) 04-09 17:30:56.482: E/AndroidRuntime(9980): 在 android.widget.FrameLayout.onMeasure (FrameLayout.java:245) 04-09 17:30:56.482: E/AndroidRuntime(9980): 在 android.view.View.measure(View.java:8171) 04-09 17:30:56.482: E/AndroidRuntime (9980): 在 android.view.ViewRoot.performTraversals(ViewRoot.java:801) 04-09 17:30:56.482: E/AndroidRuntime(9980): 在 android.view.ViewRoot。handleMessage(ViewRoot.java:1727) 04-09 17:30:56.482: E/AndroidRuntime(9980): 在 android.os.Handler.dispatchMessage(Handler.java:99) 04-09 17:30:56.482: E/ AndroidRuntime(9980): 在 android.os.Looper.loop(Looper.java:123) 04-09 17:30:56.482: E/AndroidRuntime(9980): 在 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): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858 ) 04-09 17:30:56.482: E/AndroidRuntime(9980): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 04-09 17:30:56.482: E/AndroidRuntime(9980 ):在达尔维克。system.NativeStart.main(本机方法)

我不太了解 logcat,我是 Java 新手。我知道问题出在这段代码中;当我删除它时,微调器会打开并显示“请选择一个类别”。

while (eventType != XmlPullParser.END_DOCUMENT) {
            if (eventType == XmlPullParser.START_TAG && parser.getName().equals("name")) {
                categorys.add(parser.getText());
            }
            parser.next();
            eventType = parser.getEventType();
        }

但是该代码对我来说似乎很干净,请帮忙吗?感谢您的时间和帮助,我将非常感激,zeokila。

4

1 回答 1

1

查看javadoc parser.getName()可能为空:

如果当前事件不是 START_TAG、END_TAG 或 ENTITY_REF,则返回 null。

您可以尝试改用它:"name".equals(parser.getName())如果parser.getName()为空,它会返回 false。

并且int eventType = parser.getEventType();可能应该在您的 while 循环中,否则它的值在您调用时不会更新parser.next();

于 2012-04-09T15:40:46.427 回答