Приложение вылетает при добавлении вида в макет при использовании int id Android SDK

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

  •  02-01-2020
  •  | 
  •  

Вопрос

По сути, смысл кода состоит в том, чтобы интерпретировать строку таким образом, чтобы создаваемое представление было помещено в предыдущее упомянутое представление.

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

Вот код для этого.

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();

Когда приложение выходит из строя, я получаю следующую ошибку logcat:

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)

Этот журнал показывает, что ошибка возникает в ((LinearLayout) findViewById(relative)).addView(tv);в строке 116.

В чем проблема с моим кодом?

Это было полезно?

Решение

Из-за следующего кода,

int relative2 = 0;
final int relative = relative2;

значение relative равно 0, которое является окончательным и не может быть изменено.Итак, когда вы выступаете ((LinearLayout) findViewById(relative)), это становится похожим ((LinearLayout) findViewById(0)).Поскольку нет представления, связанного с идентификатором 0, вы не получаете ссылку на это представление, следовательно, значение равно null.И когда вы пытаетесь добавить к нему представление, вы получаете исключение nullpointer.

Прочитай findViewById() из документов.Здесь говорится, что

Находит представление, которое было идентифицировано атрибутом id из XML, который был обработан в onCreate(Bundle).

Возвращает представление, если оно найдено, или null в противном случае.

Итак, в основном в вашем случае убедитесь, что при попытке найти представление по идентификатору представление присутствует в файле макета xml с присвоенным ему соответствующим идентификатором.Так что, когда R.java файл сгенерирован, этот идентификатор будет сопоставлен значению int.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top