NPE bei TextView.setText(text)

  • Antworten:4
Audioline
  • Forum-Beiträge: 18

02.04.2015, 21:18:07 via Website

Hallo zusammen,

habe mir vor kurzem ein Buch über die Spieleprogrammierung im Android Studio beschaffen. Das Buch ist allerdings knapp 1 jahr alt und wurde mit einer alten Version des Android Studios "benutzt". Mein Problem ist nun folgendes: ich habe ein normales Layout und versuche auf diesem ein Art "container" von 2 TextViews mittels eines Fragments auszugeben. Beim Aufruf folgender Zeile bekomme ich allerdings eine NullPointerException:

 tv.setText(text);

Ich habe eben mal ein bisschen gegoogelt -> es muss wohl irgendwas mit der onCreateView Methode auf sich haben, die ich vorher(?) aufrufen muss, damit man weiß, welche TextView ich meine. Oder kann es sein, dass ich durch den Aufruf von container.removeAllViews(); die TextView des Layouts wieder entferne?

Kann mir bitte einer weiterhelfen?

Hier ein Auszug aus dem LogCat:

04-02 18:55:03.981      933-933/com.kissthefrog E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.NullPointerException
        at com.kissthefrog.MyActivity.fillTextView(MyActivity.java:57)
        at com.kissthefrog.MyActivity.update(MyActivity.java:63)
        at com.kissthefrog.MyActivity.initRound(MyActivity.java:52)
        at com.kissthefrog.MyActivity.newGame(MyActivity.java:47)
        at com.kissthefrog.MyActivity.startGame(MyActivity.java:79)
        at com.kissthefrog.MyActivity.onClick(MyActivity.java:71)
        at android.view.View.performClick(View.java:3480)
        at android.view.View$PerformClick.run(View.java:13983)
        at android.os.Handler.handleCallback(Handler.java:605)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4340)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
        at dalvik.system.NativeStart.main(Native Method)

Hier meine Activity:

public class MyActivity extends Activity implements View.OnClickListener {

private int points, countdown, round;


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

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);
}

private void showGameOverFragment(){
    ViewGroup container = (ViewGroup) findViewById(R.id.container);
    container.addView(getLayoutInflater().inflate(R.layout.fragment_gameover, null));
    container.findViewById(R.id.playAgain).setOnClickListener(this);
}

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

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

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

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));
}

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

private void startGame() {
    newGame();
}

}

Hier der XML Code des Fragments:

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

android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/app_name"
    android:id="@+id/title"
    android:layout_gravity="center_horizontal"
    android:textSize="48dp"
    android:textColor="@color/gameTitle"
    android:singleLine="false" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/start_tv_text"
    android:id="@+id/start"
    android:layout_gravity="center_horizontal" />

Hier der XML Code des Layouts:

<FrameLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/countainer_out">

<FrameLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/container"
    android:focusableInTouchMode="true">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="000000"
        android:id="@+id/round"
        android:layout_gravity="left|top"
        android:textColor="@color/round" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="000000000"
        android:id="@+id/points"
        android:layout_gravity="right|top"
        android:textColor="@color/points"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="000000"
        android:id="@+id/countdown"
        android:layout_gravity="center_horizontal|bottom"
        android:textColor="@color/countdown"
        android:singleLine="false" />
</FrameLayout>

— geändert am 02.04.2015, 21:21:45

Antworten
Sven R.
  • Forum-Beiträge: 1.904

03.04.2015, 14:03:25 via App

Weil ein View nicht gefunden werden kann, wird null zurück gegeben.
Um durch Ausprobieren das Problem zu finden, schreibst du nur den Testcode in die OnCreate(). Wenn das funktioniert, wissen wir, dass die Logik mit newGame() und so nicht optimal ist. Ich habe zwar noch nie ein Spiel entwickelt für Android, aber das sieht mir zu spaghettihaft aus. Ich würde ein Spiel-Objekt machen, das sich nur um die Logik kümmert und via Callbacks oder getter die Ui nicht direkt ansteuert, sondern das halt die Activity oder ein Fragment machen lässt.

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

03.04.2015, 14:07:01 via Website

Du sagst du willst ein Fragment nutzen.
Das ist gut, aber ich sehe nirgends eine Klasse die von Fragment erbt.
Zudem Fehle dann in der Activity ein Fragment Manager.
Ich denke du solltest dir das noch mal durchlesen: http://www.tutorialspoint.com/android/android_fragments.htm

LG

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Frederik B.
  • Forum-Beiträge: 53

03.04.2015, 15:47:52 via Website

Ich kenne das Buch. :D

Und ich glaub ich kann dir auch helfen.
Denn in deinem Layout must du das 2. Framelayout sofort wieder schließen.
Es ist dann also quasi leer, aber soll die größe "match parent" haben.
Ansonsten hast du schon recht, dass du mit container.removeAllViews() alles wieder entfernst.
Also versuchs mal indem du das 2. Framelayout direkt wieder schließt. :)

Antworten
Wilfried Bergmann
  • Forum-Beiträge: 1

26.01.2016, 09:00:26 via Website

Ich weiß dieser Thread ist schon bissl älter, dennoch ist es genau mein Problem wie es Eingangs beschrieben wurde.

Frederick B. was meinst du mit dem 2. Framelayout? Ich arbeite vermutlich das Selbe Buch gerade durch (Spieleprogrammierung mit Android Studio), meinst du mit dem 2. Framelayout das Startfragment?

Ich habe mittlerweile eine ganze Litanei an Befehlen/Methoden die den Lebenszyklus eines Layout und eines Fragment betreffen. Leider ist aber keiner dabei, der die Verwendung für mich verständlich erklärt.

Kann hier Jemand ein handfestes Beispiel zeigen?

Antworten