App stürzt beim Hinzufügen einer Ansicht zum Layout ab, wenn int id Android SDK verwendet wird

StackOverflow https://stackoverflow.com//questions/25091594

  •  02-01-2020
  •  | 
  •  

Frage

Grundsätzlich besteht der Sinn des Codes darin, eine Zeichenfolge so zu interpretieren, dass die zu erstellende Ansicht in der zuvor genannten Ansicht platziert wird.

% $- background:#000000 % 
Hello, World.
% $- background:#ffffff %
$+ id:test type:container %
Test

Hier ist der Code dafür.

new Thread() {
        StringBuilder text = new StringBuilder();
        @Override
        public void run() {
            try

            {
                String str = "";
                URL url = new URL("http://example.com/" + mes + "/" + mes + ".meb");
                BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));

                while ((str = in.readLine()) != null) {
                    text.append(str);
                }
                in.close();
            } catch (MalformedURLException e1)

            {
            }
            catch (IOException e)
            {
            }
            if(message.contains(".meb")) {
                String strn = text.toString().replace("\n", "").replace("\r", "");
                String str[] = strn.toString().split("%");
                int relative2 = 0;
                final int relative = relative2;
                for (final String l : str) {
                    String code[] = l.split(" ");
                    if (l.toString().contains("$-")) {
                        for(String p : code)
                        {
                            if(p.toString().contains("background"))
                            {
                                final String set[] = p.toString().split(":");
                                runOnUiThread(new Runnable() {
                                    @Override
                                    public void run() {
                                (findViewById(R.id.body)).setBackgroundColor(Color.parseColor(set[1]));
                                    }
                                });
                            }
                        }
                    }
                    else if(l.toString().contains("$+"))
                    {
                        String[] g = code[2].split(":");
                        String[] c = code[3].split(":");
                        final String[] test = {g[1], "100"};
                        globvar.add(test);
                        if(c[1].toString().equals("container")) {
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    final LinearLayout element = new LinearLayout(getApplicationContext());
                                    element.setBackgroundColor(Color.parseColor("#FFFFFF"));
                                    element.setMinimumHeight(50);
                                    element.setId(Integer.parseInt(test[1]));
                                    ((LinearLayout) findViewById(relative)).addView(element);
                                }
                            });
                            relative2 = Integer.parseInt(test[1]);
                        }
                    }
                    else                        {

                        if(!l.toString().isEmpty()) {
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    final TextView tv = new TextView(getApplicationContext());
                                    tv.setTextColor(Color.parseColor("#000000"));
                                    tv.setTextSize(18);
                                    tv.setText(l);
                                    ((LinearLayout) findViewById(relative)).addView(tv);
                                }
                            });
                        }
                    }
                }
            }
            else {
                if(message == null) {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {

                        }
                    });
                }
            }
        }
    }.start();

Wenn die App abstürzt, erhalte ich den folgenden Logcat-Fehler:

08-01 19:44:27.149 29893 29893 E AndroidRuntime: FATAL EXCEPTION: main

08-01 19:44:27.149 29893 29893 E AndroidRuntime: java.lang.NullPointerException

08-01 19:44:27.149 29893 29893 E AndroidRuntime:    at example.yemeb.List$1$3.run(List.java:116)

08-01 19:44:27.149 29893 29893 E AndroidRuntime:    at android.os.Handler.handleCallback(Handler.java:615)

08-01 19:44:27.149 29893 29893 E AndroidRuntime:    at android.os.Handler.dispatchMessage(Handler.java:92)

08-01 19:44:27.149 29893 29893 E AndroidRuntime:    at android.os.Looper.loop(Looper.java:137)

08-01 19:44:27.149 29893 29893 E AndroidRuntime:    at android.app.ActivityThread.main(ActivityThread.java:4931)

08-01 19:44:27.149 29893 29893 E AndroidRuntime:    at java.lang.reflect.Method.invokeNative(Native Method)

08-01 19:44:27.149 29893 29893 E AndroidRuntime:    at java.lang.reflect.Method.invoke(Method.java:511)

08-01 19:44:27.149 29893 29893 E AndroidRuntime:    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)

08-01 19:44:27.149 29893 29893 E AndroidRuntime:    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558)

08-01 19:44:27.149 29893 29893 E AndroidRuntime:    at dalvik.system.NativeStart.main(Native Method)

Dieses Protokoll zeigt, dass der Fehler bei ((LinearLayout) findViewById(relative)) auftritt.addView(Fernseher);in Zeile 116.

Was ist das Problem mit meinem Code?

War es hilfreich?

Lösung

Wegen des folgenden Codes,

int relative2 = 0;
final int relative = relative2;

der Wert von relative ist 0, was endgültig ist und nicht geändert werden kann.Also, wenn Sie auftreten ((LinearLayout) findViewById(relative)), es wird wie ((LinearLayout) findViewById(0)).Da der ID 0 keine Ansicht zugeordnet ist, erhalten Sie keinen Verweis auf diese Ansicht, daher ist der Wert null.Und wenn Sie versuchen, eine Ansicht hinzuzufügen, erhalten Sie eine Nullzeiger-Ausnahme.

Lesen findViewById() von docs.It sagt das

Findet eine Ansicht, die durch das id-Attribut aus dem XML identifiziert wurde, das wurde in onCreate (Bundle) verarbeitet.

Gibt die Ansicht zurück, falls gefunden, andernfalls null.

Stellen Sie also in Ihrem Fall grundsätzlich sicher, dass die Ansicht in einer XML-Layoutdatei mit der richtigen zugewiesenen ID vorhanden ist, wenn Sie versuchen, eine Ansicht anhand der ID zu finden.So dass, wenn die R.java datei generiert wird, wird diese ID einem int-Wert zugeordnet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top