Pergunta

Basicamente, o objetivo do código é interpretar uma String de forma que a View que está sendo criada seja colocada na View anterior mencionada.

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

Aqui está o código para isso.

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

Quando o aplicativo trava, recebo o seguinte erro de 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)

Este log mostra que o erro está ocorrendo em ((LinearLayout) findViewById(relative)).addView(tv);na linha 116.

Qual é o problema com meu código?

Foi útil?

Solução

Por causa do código a seguir,

int relative2 = 0;
final int relative = relative2;

o valor de relativo é 0, que é final e não pode ser alterado.Então, quando você executa ((LinearLayout) findViewById(relative)), fica como ((LinearLayout) findViewById(0)).Como não há nenhuma visualização associada ao ID 0, você não obtém a referência a essa visualização, portanto o valor é nulo.E quando você tenta adicionar uma visualização a ela, você recebe uma exceção de ponteiro nulo.

Ler encontrarViewById() dos documentos. Diz que

Encontra uma visão que foi identificada pelo atributo ID do XML que foi processado no OnCreate (pacote).

Retorna a visualização se encontrada ou nula caso contrário.

Então, basicamente, no seu caso, certifique-se de que, ao tentar encontrar uma visualização por ID, a visualização esteja presente no arquivo de layout xml com o ID adequado atribuído a ela.Para que quando o R.java for gerado, esse ID será mapeado para um valor int.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top