La aplicación se bloquea cuando la adición de la Vista diseño cuando se utiliza int id del SDK de Android
Pregunta
Básicamente, el punto de que el código es interpretar una Cadena en una forma que la Vista está creado estará situado en el estado de Vista mencionados.
% $- background:#000000 %
Hello, World.
% $- background:#ffffff %
$+ id:test type:container %
Test
Aquí está el código.
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();
Cuando la aplicación se bloquea, me sale el siguiente logcat de error:
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 registro muestra que se está produciendo el error en ((LinearLayout) findViewById(relativa)).addView(tv);en la línea 116.
¿Cuál es el problema con mi código?
Solución
Porque de código siguiente,
int relative2 = 0;
final int relative = relative2;
el valor de la relación es 0, que es definitiva y no puede ser cambiado.Así que cuando usted realice ((LinearLayout) findViewById(relative))
, se convierte en ((LinearLayout) findViewById(0))
.Como no hay ninguna vista asociada con el id 0, usted no recibe la referencia a ese punto de vista, por lo tanto el valor es null.Y cuando intenta agregar una vista a ella, se obtiene un nullpointer excepción.
Leer findViewById() desde google docs.Se dice que
Encuentra un punto de vista de que fue identificado por el atributo id del XML fue procesado en onCreate(Bundle).
Devuelve La vista si se encuentra o null en caso contrario.
Así que, básicamente, en su caso, asegúrese de que cuando se intenta encontrar una vista mediante el id, la vista está presente en el fichero xml de diseño con la debida identificación asignado.De modo que cuando el R.java
archivo es generado, este identificador se asigna a un valor int.