2017-05-15 35 views
-4

Ich bin sehr neu in Android UI, ich habe nach einem Ort gesucht Ich kann die grundlegende Struktur der Benutzeroberfläche lernen und wie Kommunikation und Layouts funktionieren sollte. Aber egal. Mein Problem kommt von mir, wenn ich versuche, den Wert einer TextView in einem Fragment zu ändern. Ich erhalte immer eine nullPointerException, wenn ich versuche, den Wert zu ändern. Ich verwende einen Fragmentmanager, um auf das Fragment zu verweisen.Kommunikation mit Fragment NullPointerException

Hier ist das Fragment Code:

package com.archronix.infotainment; 

import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 


public class Fragment1 extends android.support.v4.app.Fragment { 
public TextView status; 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.fragment_fragment1, container, 
    false); 
    return v; 
} 

public static Fragment1 newInstance() { 
    Fragment1 f = new Fragment1(); 
    return f; 
} 

public void postText(String str){ 
    status.setText(status.getText()+"\n"+str); 
} 
} 

Und das ist, wie ich meine Fragment Manager erklären:

fragment1 = (Fragment1) 
getSupportFragmentManager().findFragmentById(R.id.fragment1); 

Und, wie ich es verwenden:

fragment1.postText("testtext"); 

Mein logcat:

05-15 10 : 56: 42.406 4109-4109/com.archronix.infotainment E/AndroidRuntime: FATALE AUSNAHME: Haupt Prozess: com.archronix.infotainment, PID: 4109 java.lang.RuntimeException: kann Aktivität nicht starten ComponentInfo {com.archronix. infotainment/com.archronix.infotainment.MainActivity}: java.lang.NullPointerException: Versuch, die virtuelle Methode 'void com.archronix.infotainment.Fragment1.postText (java.lang.String)' für eine Nullobjekt-Referenz bei android aufzurufen. app.ActivityThread.performLaunchActivity (ActivityThread.java:2298) bei android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2360) bei android.app.ActivityThread.access $ 800 (ActivityThread.java:144) bei android.app .ActivityThread $ H.HandleMes Salbei (ActivityThread.java:1278) bei android.os.Handler.dispatchMessage (Handler.java:102) bei android.os.Looper.loop (Looper.java:135) bei android.app.ActivityThread.main (ActivityThread.java:5221) bei java.lang.reflect.Method.invoke (native Methode) bei java.lang.reflect.Method.invoke (Method.java:372) bei com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:899) bei com.android.internal.os.ZygoteInit.main (ZygoteInit.java:694) verursacht durch: java.lang.NullPointerException: Versuch, virtuelle Methode 'void com aufzurufen. arronix.infotainment.Fragment1.postText (java.lang.String) 'an einem ULL Objektreferenz bei com.archronix.infotainment.MainActivity.onCreate (MainActivity.java:102) bei android.app.Activity.performCreate (Activity.java:5933) bei android.app.Instrumentation.callActivityOnCreate (Instrumentation.java : 1105) bei android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2251) bei android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2360) bei android.app.ActivityThread.access $ 800 (ActivityThread.java: 144) bei android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1278) bei android.os.Handler.dispatchMessage (Handler.java:102) bei android.os.Looper.loop (Looper.java:135) bei android.app.ActivityThread.main (ActivityThread.java:5221) bei java.lang.reflect.Method.invoke (native Methode) bei java .lang.reflect.Method.invoke (Methode.java:372) bei com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:899) bei com.android.internal.os.ZygoteInit.main (ZygoteInit.java:694)

Entschuldigt meine newbieness. Ich habe 20 Stack-Überlauf-Beiträge zu ähnlichen Themen gelesen, aber alle scheinen entweder veraltet oder nicht konsistent zu sein. Was ist der beste Weg, um meine Aufgabe zu erfüllen? Vielen Dank.

+0

Ich habe den Beitrag gelesen. Und ich verstehe, wie NullPointerExceptions arbeiten, ist mein Problem, ich kann nicht zu identifizieren, wo und mit welcher Variable das Problem in meinem Code auftritt. –

+0

Sie können den Debugger dafür verwenden – Daniele

+0

Wie Sie sehen können, teilt mir der Debugger mit, dass es sich um den Aufruf der Methode handelt. Ich weiß nicht, warum das eine NullPointerException aufruft. Ich wünschte, ich würde Androidechniken gut genug verstehen, um mein Problem aufspüren zu können, aber leider nicht. Es tut mir leid, wenn eine Lösung verfügbar ist, ich bin mir nicht sicher, nach was ich sonst suchen soll. –

Antwort

0

In onCreateView sollten Sie Ihren Textview wie so initialisieren:

status = (TextView) v.findViewById(R.id.tv_status); 

Wenn Sie den Text kennen, die Sie vor dem FragmentTransaction festlegen möchten Sie ein Bundle verwenden können (How to transfer some data to another Fragment?)

+0

Vielen Dank! Kann ich Bundles während der Laufzeit und nicht nur in onCreate mehrfach zur Laufzeit verwenden? –

+0

Nun, das Bundle wird auch verwendet, wenn sich die Bildschirmausrichtung ändert und Sie einige Werte speichern möchten (da die Aktivität zerstört und neu erstellt wird). –

+0

Im Allgemeinen wird ein Bündel für die Übertragung von Daten von Aktivität A zu Aktivität B oder zwischen Fragmenten verwendet. –

1

Statusvariable ist nicht einer Textansicht zugewiesen. Fügen Sie den folgenden Code in onCreateView vor der Rückgabeanweisung

status=v.findViewById(R.id.<nameoftextview>); 
Verwandte Themen