2010-08-30 17 views
18

Estoy dando mis primeros pasos en Android y estoy empezando con una aplicación muy simple que realiza un seguimiento del progreso a través de un patrón de punto y muestra las instrucciones para la fila correspondiente.Recurso no encontrado TextView

Quiero actualizar un par de objetos TextView mediante programación. Sin embargo, el uso de getViewById() no parece identificarlos correctamente y la aplicación falla.

Después de buscar en Google parece que a veces hay problemas con el espacio de nombres XML en el diseño XML, pero el mío se ve bien. ¿Tiene algo que ver con el alcance, tal vez?

instructions.java (esta es la única actividad)

package uk.co.oketchup.blanketsquare; 

import android.app.Activity; 
import android.os.Bundle; 
import android.content.SharedPreferences; 
import android.widget.Button; 
import android.widget.TextView; 
import android.view.View.OnClickListener; 
import android.view.View; 

public class instructions extends Activity 
{ 
    private int mRow; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 

     /* retrieve row from shared preferences, or start from zero if nothing there */ 
     SharedPreferences settings = getPreferences(MODE_PRIVATE); 
     mRow = settings.getInt("row",0); 

     setContentView(R.layout.main); 

     /* associate onClick listeners with the two buttons */ 
     final Button btnIncrement = (Button) findViewById(R.id.increment); 
     btnIncrement.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       // Increment row 
       ++mRow; 
       calcAndUpdate(); 
      } 
     }); 

     final Button btnDecrement = (Button) findViewById(R.id.decrement); 
     btnDecrement.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       // Decrement row 
       --mRow; 
       calcAndUpdate(); 
      } 
     }); 
    } 

    private void calcAndUpdate() { 
    String Instructions; 
    int knit1; 
    int knit2; 
    int remaining; 

    if (mRow%2 == 1) 
     { 
     /* Odd row */ 
     knit1 = 40 - mRow; 
     Instructions = "K" + knit1; 
     remaining = knit1; 
     } 
     else 
     { 
     /* Even row */ 
     knit1 = 18 - mRow/2; 
     knit2 = knit1 + 1; 
     Instructions = "Sl 1, k" + knit1 + ", [sl 1 kwise] 2 times, k1, p2sso, k" + knit2; 
     remaining = knit1 + knit2 + 2; 
     } 

    /* Update the display */ 
    TextView tRow = (TextView) findViewById(R.id.row); 
    TextView tInstr = (TextView) findViewById(R.id.instr); 
    TextView tStRem = (TextView) findViewById(R.id.stitchremain); 

    /* Set the text */ 
    tRow.setText(mRow); 
    tInstr.setText(Instructions); 
    tStRem.setText(remaining); 

    } 

} 

/res/layout/main.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
    <TextView 
     android:id="@+id/row" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="Row" 
     /> 
    <TextView 
     android:id="@+id/instr" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="Instructions" 
     android:layout_below="@id/row" 
     /> 
    <Button 
     android:id="@+id/increment" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="+" 
     android:layout_alignParentBottom="true" /> 
    <Button 
     android:id="@+id/decrement" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="-" 
     android:layout_toRightOf="@id/increment" 
     android:layout_alignParentBottom="true" /> 
    <TextView 
     android:id="@+id/stitchremain" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="stitches remaining" 
     android:layout_above="@id/increment" 
     /> 
</RelativeLayout> 

La TextView objetos parecen haber sido registrado como bien aparecen en R.java

public static final class id { 
    public static final int decrement=0x7f050003; 
    public static final int increment=0x7f050002; 
    public static final int instr=0x7f050001; 
    public static final int row=0x7f050000; 
    public static final int stitchremain=0x7f050004; 
} 

Aquí está el mensaje de error que se muestra en ddms.

Uncaught handler: thread main exiting due to uncaught exception 
android.content.res.Resources$NotFoundException: String resource ID #0x1 
    at android.content.res.Resources.getText(Resources.java:200) 
    at android.widget.TextView.setText(TextView.java:2813) 
    at uk.co.oketchup.blanketsquare.instructions.calcAndUpdate(instructions.java:75) 
    at uk.co.oketchup.blanketsquare.instructions.access$100(instructions.java:11) 
    at uk.co.oketchup.blanketsquare.instructions$1.onClick(instructions.java:33) 
[etc] 

Muchas gracias por su ayuda.

Respuesta

78

mRow es un número entero. Cuando llama a setText (mRow) en la línea 75, cree que está intentando establecer el texto con un recurso de Cadena con ID = el valor de mRow.

En su lugar, hacer:

tRow.setText(Integer.toString(mRow)); 
+0

Eso es lo arregló - gracias mucho! –

+0

¡Hey estaba atrapado en el mismo problema! Gracias ! +1 – GoodSp33d

+0

Gracias por esto: D +1 – jtwigg

4

Siempre debe convertir otros valores a la cadena antes de que Textview, como

txtX.setText(Integer.toString(intVal));