Übergabe in Fragment!?

  • 6 Antworten
  • Letztes Antwortdatum
M

mitch_HD2

Fortgeschrittenes Mitglied
1
Guten Abend.
Ich habe ein kleines Problem.
Bin eine kleine "Haus" App am schreiben die bisher ganz gut funktioniert hat..

Ich habe 2 Fragmente (fragmentAdapter).. und die Main Activity..

In meiner Main Activity schicke ich ein UDP packet zum Server...

Code:
public static void Connect(){
	try {
		InetAddress serverAddr = InetAddress.getByName(ipInt); //die IP vom editttext wird in einer Internetadresse umgewandelt
		
		ByteLength = SendByte.length;
		
		DatagramSocket socket = new DatagramSocket();
		DatagramPacket packet = new DatagramPacket(SendByte, ByteLength, serverAddr, Port);
		socket.send(packet);
		}
	
	
	catch (Exception e) 
	{
	}
Wenn der Server das Packet empfangen hat schickt der mir die aktuelle Temperatur zurück die ich dann empfange.
Code:
public static void Recieve() throws IOException{
	DatagramPacket p = new DatagramPacket(BufRec, BufRec.length);
	DatagramSocket s = new DatagramSocket(Port);
	s.receive(p);
	BufRecStr = new String(BufRec, 0, p.getLength());
	Log.d("Udp tutorial","REC" + BufRecStr);
	TempRecIn = BufRecStr.substring(0,5);
	TempRecOut = BufRecStr.substring(6,11);
	
	s.close();

}

soweit so gut... nun habe ich da meine
Code:
TempRecIn
und
Code:
TempRecOut

Die beiden Strings will ich nun an 2 TextView's übergeben.
Diese TextView's liegen aber auf einem Fragment.
Code:
public static class ÜbergabeTemp extends AsyncTask<Object, Object, Object> {
	
	@Override
    protected Object doInBackground(Object... arg0) {

		//Fragment1.settext(TempRecIn,TempRecOut);
		Fragment1.TempIn_txt.setText(TempRecIn+" °C");
		Fragment1.TempOut_txt.setText(TempRecOut+" °C");
		
        return null;
    }
}

Die class
Code:
ÜbergabeTemp
wird beim OnCreate ausgeführt...

Und noch einmal über einen MenuInflater.
Dort gibts ein Punkt IP-Addresse wo man die Server IP einträgt... Klickt man auf OK dann schickt der wieder ein Packet zum Server Empfängt und soll den String an die TextView geben.

Wenn ich nun die App starte... macht der alles wie er soll.
Wenn ich das ganze dann aber über den MenuInflater mache... CRASH...

Code:
09-29 19:20:21.315: E/AndroidRuntime(19457): FATAL EXCEPTION: AsyncTask #5
09-29 19:20:21.315: E/AndroidRuntime(19457): java.lang.RuntimeException: An error occured while executing doInBackground()
09-29 19:20:21.315: E/AndroidRuntime(19457): 	at android.os.AsyncTask$3.done(AsyncTask.java:299)
09-29 19:20:21.315: E/AndroidRuntime(19457): 	at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
09-29 19:20:21.315: E/AndroidRuntime(19457): 	at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
09-29 19:20:21.315: E/AndroidRuntime(19457): 	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
09-29 19:20:21.315: E/AndroidRuntime(19457): 	at java.util.concurrent.FutureTask.run(FutureTask.java:137)
09-29 19:20:21.315: E/AndroidRuntime(19457): 	at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
09-29 19:20:21.315: E/AndroidRuntime(19457): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
09-29 19:20:21.315: E/AndroidRuntime(19457): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
09-29 19:20:21.315: E/AndroidRuntime(19457): 	at java.lang.Thread.run(Thread.java:856)
09-29 19:20:21.315: E/AndroidRuntime(19457): Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
09-29 19:20:21.315: E/AndroidRuntime(19457): 	at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4867)
09-29 19:20:21.315: E/AndroidRuntime(19457): 	at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:947)
09-29 19:20:21.315: E/AndroidRuntime(19457): 	at android.view.View.requestLayout(View.java:15430)
09-29 19:20:21.315: E/AndroidRuntime(19457): 	at android.view.View.requestLayout(View.java:15430)
09-29 19:20:21.315: E/AndroidRuntime(19457): 	at android.view.View.requestLayout(View.java:15430)
09-29 19:20:21.315: E/AndroidRuntime(19457): 	at android.view.View.requestLayout(View.java:15430)
09-29 19:20:21.315: E/AndroidRuntime(19457): 	at android.view.View.requestLayout(View.java:15430)
09-29 19:20:21.315: E/AndroidRuntime(19457): 	at android.view.View.requestLayout(View.java:15430)
09-29 19:20:21.315: E/AndroidRuntime(19457): 	at android.view.View.requestLayout(View.java:15430)
09-29 19:20:21.315: E/AndroidRuntime(19457): 	at android.view.View.requestLayout(View.java:15430)
09-29 19:20:21.315: E/AndroidRuntime(19457): 	at android.widget.TextView.checkForRelayout(TextView.java:6625)
09-29 19:20:21.315: E/AndroidRuntime(19457): 	at android.widget.TextView.setText(TextView.java:3719)
09-29 19:20:21.315: E/AndroidRuntime(19457): 	at android.widget.TextView.setText(TextView.java:3577)
09-29 19:20:21.315: E/AndroidRuntime(19457): 	at android.widget.TextView.setText(TextView.java:3552)
09-29 19:20:21.315: E/AndroidRuntime(19457): 	at mitch.test.ledrgb.RGBActivity$ÜbergabeTemp.doInBackground(RGBActivity.java:256)
09-29 19:20:21.315: E/AndroidRuntime(19457): 	at android.os.AsyncTask$2.call(AsyncTask.java:287)
09-29 19:20:21.315: E/AndroidRuntime(19457): 	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
09-29 19:20:21.315: E/AndroidRuntime(19457): 	... 5 more

Kann mir da jemand helfen?


EDIT:

habe eben versucht das ganze mit einem OnClick zu übergeben... aber immernoch das selbe
 
Zuletzt bearbeitet:
Hi, ich würde im Fragment 1 eine Methode anbieten, in der ich die Zwei textViews mit den Strings befülle. Eine instanz des ersten Fragments kannst du ja global machen in deiner Main activity.

also so in etwa
Code:
Main.java
private static Fragment1 _frag1;
onCreate(..){
...

_frag1 = Fragment1.getInstance();

}

private void fillTemps(String temp1, String temp2){
   _frag1.setTemps(temp1, tmp2);
}


in Frag1.java

public void setTemps(String temp1, String temp2){
   _tvTemp1.setText(temp1);
   _tvTemp2.setText(temp2);
}

du kannst auch aus dem Fragment wieder auf public Methoden der MainActivity zugreifen indem du den ((MainActivity)getActivity).somePubMethod(String sss) context nach Mainactivty castest.

Übrigens ist es bei deinem Beispiel oben eine schlechte Idee UI Sachen im Background Thread zu machen. Verwende dazu den Callback onPostExecute deines AsyncTasks

Ich hoffe das hilft dir weiter
 
Zuletzt bearbeitet:
Hej danke

habe das so probiert wie du geschrieben hast allerdings bekomme ich in bei getInstance eine fehlermeldung
Code:
The method getInstance() is undefined for the type Fragment1
 
Dann generiere dasa Fragment wie immer mit new Fragment1(). das sollte funktionieren ;)
 
ne sorry... so klappt es nicht...
das ist meine Fragment1

Code:
public class Fragment1 extends Fragment{

float TempIn_val;
float TempOut_val;

static TextView TempIn_txt;
static TextView TempOut_txt;


	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
		View w =  inflater.inflate(R.layout.fragment_1, null);


        return w;
	}


	public void setTemps(String temp1, String temp2){
		TempIn_txt.setText(temp1);
		TempOut_txt.setText(temp2);
		}

hab ich vielleicht irgendwas vergessen? bin nicht der hardcore Programmierer;)
 
Du musst schon noch die beiden TextViews initialisieren und deiner TextView Id zuweisen? zeig doch mal deine relevanten Stellen in der Main und im Fragment!
Las mich raten in der LogCat steht auch NULLPOINTER EXCEPTION
 
Zuletzt bearbeitet:
Also aus dem error log den du geposted hast würde ich schließen, dass der async Task das Problem ist. Denn nur der thread der das list view erstellt hat darf die Werte dort ändern. Dieser thread ist üblicherweise der uiTread. Um dort drin etwas auszuführen müsstest du die Methode runOnUiTread deiner Activity nutzen.
 
Zurück
Oben Unten