web-dev-qa-db-ja.com

-Java.lang.NullPointerException-nullオブジェクト参照のsetText

これが私が数時間しようとしていることです。MainActivity.Javaファイル(以下を参照)と、開始ボタンのあるfragment_start.xmlファイルがあります。スタートボタンをタップすると、points-/round-およびcountdown-Textviewsを含むactivity_main.xmlファイルが表示されます。それは機能せず、これが起こっていることです:

Logcatは私に言う:PID:1240 Java.lang.NullPointerException:仮想メソッド 'void Android.widget.TextView.setText(Java.lang.CharSequence)'をnullオブジェクト参照で呼び出そう

エミュレータは次を表示します。残念ながら、GAMEは停止しました。

プログラミングの初心者であることに言及する必要がありますか?

アドバイスをありがとう!

import Android.app.Activity;
import Android.os.Bundle;
import Android.view.View;
import Android.view.ViewGroup;
import Android.widget.TextView;


public class MainActivity extends Activity implements View.OnClickListener {

private int points;
private int round;
private int countdown;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    showStartFragment();
}

private void newGame () {
    points=0;
    round=1;
    initRound();
}

private void initRound() {
    countdown = 10;
    update();
}

private void update () {
    fillTextView(R.id.points, Integer.toString(points));
    fillTextView(R.id.round, Integer.toString(round));
    fillTextView(R.id.countdown, Integer.toString(countdown * 1000));
}

private void fillTextView (int id, String text) {
    TextView tv = (TextView) findViewById(id);
    tv.setText(text);
}

private void showStartFragment() {
    ViewGroup container = (ViewGroup) findViewById(R.id.container);
    container.removeAllViews();
    container.addView(
            getLayoutInflater().inflate(R.layout.fragment_start, null) );
    container.findViewById(R.id.start).setOnClickListener(this);
}

@Override
public void onClick(View view) {
    if(view.getId() == R.id.start) {
        startGame();
    }
}

public void startGame() {
    newGame();
}
}
27
George

問題はtv.setText(text)です。変数tvはおそらくnullであり、そのsetTextnullメソッドを呼び出しますが、これはできません。問題はfindViewByIdメソッドにあると思いますが、ここにはないので、コードなしではそれ以上話すことはできません。

27
JustOneJavaDev

ここにあなたの問題があります:

private void fillTextView (int id, String text) {
    TextView tv = (TextView) findViewById(id);
    tv.setText(text); // tv is null
}

->(TextView)findViewById(id); // nullを返しますが、コードから、このメソッドがnullを返す理由がわかりません。パラメーターとして指定したIDと、指定したIDを持つこのビューが存在するかどうかを追跡してみてください。

エラーメッセージは非常に明確であり、どの方法で表示されるかを示しています。ドキュメントから:

public final View findViewById (int id)
    Look for a child view with the given id. If this view has the given id, return this view.
    Parameters
        id  The id to search for.
    Returns
        The view that has the given id in the hierarchy or null

http://developer.Android.com/reference/Android/view/View.html#findViewById%28int%29

つまり、パラメーターとして指定したIDを持つビューはありません。

20
private void fillTextView (int id, String text) {
    TextView tv = (TextView) findViewById(id);
    tv.setText(text);
}

これがnullポインター例外を取得する場所である場合、findViewById()に渡したIDのビューが見つかりませんでした。関数setText()を呼び出すと、実際の例外がスローされますnull。 XMLを投稿してR.layout.activity_mainに投稿する必要があります。コードを見ただけでは、どこで問題が発生したかを特定するのは困難です。

Nullポインターの詳細: NullPointerExceptionとは何ですか?どうすれば修正できますか?

4
mgomov