setText сокрушит приложение - PullRequest
0 голосов
/ 08 марта 2012

Привет, я запускаю свое первое приложение для Android и пытаюсь заставить TextView изменить слова через некоторое время.

public class Game1Activity extends Activity {

    GameViews ngv;
    private static String gameId = "game1Activity-game";
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.game1_layout);
        ngv = (GameViews)findViewById(R.id.Game1);
        ngv.setTextView((TextView)findViewById(R.id.Text));
    };

}
public class GameViews extends View
{
    private TextView gameText;
    private long time1 = System.currentTimeMillis();

    public GameViews(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
        initGameViews();
    }

    public GameViews(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        initGameViews();
    }

    public void setTextView(TextView tv)
    {
        gameText = tv;
    }

    public void initGameViews()
    {
        setFocusable(true);
        Resources r = this.getContext().getResources();
        changeGameText();
    }

    public void changeGameText()
    {
        while (true)
        {
            if (System.currentTimeMillis() - time1 > 100)
            {
                gameText.setText(R.string.hi2);
                return;
            }
        }
    }
}

XML-файл макета:

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <game1.code.GameViews
    android:id="@+id/Game1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    tileSize="24" />

    <RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center_vertical"
    android:gravity="center" >

        <TextView
        android:id="@+id/Text"
        android:text="@string/hi1"
        android:visibility="visible"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:gravity="center_horizontal"
        android:textColor="#ff8888ff"
        android:textSize="24sp"/>
    </RelativeLayout>
</FrameLayout>

иstrings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hi1">hi1</string>
    <string name="hi2">hi2</string>
</resources>

Когда я пытаюсь запустить, logCat сообщает мне, что:

03-08 03:19:28.067: E/AndroidRuntime(602): Caused by: java.lang.NullPointerException
03-08 03:19:28.067: E/AndroidRuntime(602): game1.code.GameViews.changeGameText(GameViews.java:67)
03-08 03:19:28.067: E/AndroidRuntime(602):
game1.code.GameViews.initGameViews(GameViews.java:52)

Кажется, что setText вызывает проблему, как когда я комментировалв этой строке проблем не возникает.

Я что-то пропустил?

Ответы [ 2 ]

1 голос
/ 08 марта 2012

Вы устанавливаете строковое значение на некоторое значение в R.java, а не на значение, на которое ссылается эта переменная R.java

Измените

gameText.setText(R.string.hi2);

на

gameText.setText(getContext().getResources().getString(R.string.hi2));
0 голосов
/ 08 марта 2012

Вы должны выполнить null проверку в методе changeGameText().

if (System.currentTimeMillis() - time1 > 100 && gameText != null)
{
    gameText.setText(R.string.hi2);
    return;
}
else
{
    return;
}

Проблема в том, что этот changeGameText() вызывается initGameViews(), и этот метод называется bei the constructor GameViews().На данный момент переменная класса gameText равна null.

...