1

私には問題があり、非常に厄介な問題があり、何が原因なのかまったくわかりません! XML ファイルを読み取り、XML ファイルから ArrayList にデータを追加し、ArrayList を Spinner に配置できる Android アプリケーションを作成しようとしています。これが私のショートカットクラスの一部です。

ショートカット.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

これが私の Scanner クラスの一部です

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;

    }

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): java.lang.reflect.Method.invokeNative(ネイティブ メソッド) 04-09 17:30:56.482: E/AndroidRuntime(9980): 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();
        }

しかし、そのコードは私にはきれいに思えます。何か助けてください。あなたの時間と助けに感謝します、私は非常に感謝します、ゼオキラ.

4

1 に答える 1

1

javadoc を見ると、parser.getName()null になる可能性があります。

現在のイベントが START_TAG、END_TAG、ENTITY_REF のいずれでもない場合、null が返されます。

代わりにこれを使用してみてください: null"name".equals(parser.getName())の場合に false を返すようにします。parser.getName()

そして、int eventType = parser.getEventType();おそらくwhileループにあるはずです。そうしないと、呼び出したときにその値が更新されませんparser.next();

于 2012-04-09T15:40:46.427 に答える