Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
181 views
in Technique[技术] by (71.8m points)

android - Resource not found TextView

I am taking my first steps in Android and am starting with a very simple app which keeps track of progress through a knitting pattern and shows the instructions for the relevant row.

I want to update a couple of TextView objects programmatically. However, using getViewById() does not seem to identify them properly and the app crashes.

Having searched on Google it seems there are sometimes problems with the XML namespace in the layout XML but mine looks OK. Is it something to do with scope, perhaps?

instructions.java (this is the only activity)

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>

The TextView objects seem to have been registered ok as they appear in 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;
}

Here is the error message shown in 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]

Many thanks for your help.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

mRow is an integer. When you call setText(mRow) on line 75, it thinks that you are trying to set the text with a String resource with ID = the value of mRow.

Instead, do:

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...