fragment interce instanziieren

  • hallo,


    ich habe folgendes Problem. Ich habe 2 Fragmente: fragment1 behinhaltet nur ein button und fragment2 nur eine Textview. durch klicken des buttons bei fragment1 möchte ich, dass ein vorderfinierter text bei fragment 2 angezeigt werden soll. nun, durch recherche kam ich auf ein tutorial, welches 2 interfaces für die kommunikation von fragments implementiert. ich bekomme zwar keine fehlermeldung, aber der punkt ist, das keine kommunikation stattfindet, da FragmentCommunicator stets null ist. wie müsste ich das denn instanziieren? mein bisheriger code sieht folgendermaßen aus:


    interfaces:



    mainactivity:


    fragment1



    fragment2



    fragment1.xml


    fragment2.xml



    main.xml



    danke im voraus für die ratschläge und hilfsbereitschaft

  • Wo brauchst du dann Fragment1 / Framgnet2? Finds weder in deinem .xml oder ViewPager?


    du musst dann auch nicht fragmentcommunicator.passDatatoFragment aufrufen, sondern Fragment2.passDataToFragment, da ja die Klasse Fragment2 das Interface "FragmentCommunicator" implementiert. Allerdings seh ich in deinem Code keine Referenz zu einen Fragment2 und auch nicht wo du das einsetzt

  • hallo antifish,


    danke dir, das du mir hilfst. die fragmente habe ich nicht als xml datei sondern als java-klasse geschrieben. steht unter den code fragment1 und fragment2. die greifen von dort aus auf die layouts fragment1.xml und fragment2.xml.


    habe soeben Fragment2 in der mainactivity refenziert und die methode wie du gesagt hast geändert :


    Code
    public void SendText(View v) {
                              	
    		if(fragmentCommunicator != null) {
    			Fragment2.passDataToFragment("Hi from FragmentActivity");
    			//fragmentCommunicator.passDataToFragment("Hi from FragmentActivity");
    		}
    	}


    das ergebnis ist das gleiche. der string wird nicht übermittelt, da fragmentCommunicator null ist. wenn ich die if bedingung rausnehme, bekomme ich eine illegalstateException als fehlermeldung. :-/

  • Leider fehlt noch der Code von deinem SectionPagerAdapter? Ich nehme an da instanziert du Fragment1 und Fragment2? Je nach übergebener Position?
    Es fehlt auch der Ort wo du die SendText(...) aufrufst? Ist das aus einem onClick von einem Button?



    Falsch ist dein


    Java
    btn = (Button)findViewById(R.id.button1);


    in deiner MainActivity. "button1" gehört zu Fragment1 und wird in deiner MainActivity nicht gefunden, "btn" wird nach diesem Befehl null sein? Im Fragment1 machst du das ja auch, da ist es korrekt und wird button1 gefunden.




    Da ich deinen ganzen Code nicht kenne weiss ich nicht ob du WIRKLICH eine korrekte Referenz zu Fragment2 in deiner MainActivity hast? Falls ja dann sollte es so funktioniere:

    Java
    public void SendText(View v) {
    Fragment2.passDataToFragment("Hi from FragmentActivity");
    }



    Denn du brauchst dein fragmentCommunicator nicht, da ja Fragment2 dieses Interface implementiert kannst du es ja dirket aufrufen.
    Du könnest ebenfalls folgendens machen:

    Java
    public void SendText(View v) {
    fragmentCommunicator = Fragment2;
    		fragmentCommunicator.passDataToFragment("Hi from FragmentActivity");
    	}


    Was aber eher sinnlos währe...

  • Die "IllegalStateException" kann verschiedene Gründe haben, allerdings schon mal ein gutes Zeichen (Dein "Fragment2" ist nich null :D )
    Ist zu diesem Zeitpunkt Fragment2 schon sichtbar? Also vom ViewPager schon angezeigt?
    Ansonsten zippts du mal dein Projekt und lädts es hier rauf... hab gerade Zeit da krank :-[

  • hallo antifish,


    gute besserung erstmal :)


    also hier ist der noch der SectionsPagerAdapter :



    sendText ist eine onClick-Methode des buttons aus der fragment1.xml. das steht auch dort :)
    das ist alles vom code. mehr ist das nicht ehrlich gesagt nicht. habe alles hier reingepostet. gerade mit diesen referenzen hapert es bei mir. da stehe ich voll auf dem schlauch. ich versuche mal das was du vorgeschlagen hast und melde mich demntsprechend
    danke schonmal ;)

  • Danke :)
    Ah sorry das habe ich in der XML nicht gesehen, das mach ich normalerweise immer im Code O:-)


    Also den Adapter solltest du so überarbeiten (ansonsten wird bei jeder Anzeige ein neues Fragment instanziert, völlig unnötig)


    Und deine SendText so:

    Java
    public void SendText(View v) { 
    Fragment2 frag2 = (Fragment2)mSectionsPagerAdapter.getItem(1); 
    frag2.passDataToFragment("Test");}


    Ist zwar nicht der schönste Code aber funktioniert mal fürs erste ;)

  • woow, coole sache. es geht tatsächlich :D


    antifish, du bist der gröste :D 8)


    aber eines muss du mir mal freundlicherweise erklären:


    lag es am adapter oder eher, was in der SendText-Methode stand? du hast den adapter umgeschrieben, da du folgendes meintest:
    (ansonsten wird bei jeder Anzeige ein neues Fragment instanziert, völlig unnötig)


    passiert das in deinem fall aber auch nicht??


    und was genau geschieht hier: f2 = (Fragment2)mSectionsPagerAdapter.getItem(1);


    das mit getItem(1) habe ich nicht verstanden. sry wegen den ganzen fragen, aber ich möchte es gerne lernen, wie was funzt.


    :)

  • Kein Problem :)
    Der ViewPager + Fragments ist wahrscheinlich auch nicht das einfachste als Beginner in Sachen Android.


    An was es genau gelegen ist kann ich dir gar nicht sagen, da ich nicht weiss wie du die Referenz zu deinem Fragment2 geholt hast?
    Ich könnte mir aber vorstellen dass durch das jedesmal-neu-instanzieren deines Fragment2 im Adapter du eine Referenz zu einer nicht sichtbaren Instanz eines Fragments2 hattest und des deshalb nicht geklappt hat.


    Zum Adapter:
    Nein mit meiner Version passiert das nicht.
    Deine Version: Bei jedem Get(0 oder 1) wurde IMMER ein neues FragmentX erzeugt.
    Bei Meiner Version: Beim ersten Get(0) und beim ersten Get(1) wird geschaut ob die Variable mFramentX == null ist. Ist sie == null dann wird eine neues FragmentX erstellt und der variablen mFragmentX zugewiesen. Bei nächsten Get(0 oder 1) ist die Variable mFragmentX nicht mehr == null und es wird dann die vorherr erzeugte (also mFragmentX) verwendet. Tönt kompliziert, ist aber einfach :)
    Das ist etwas dass du auch einfach mal mit dem Debbuger Step-by-Step durchgehen kannst um zu sehen was genau passiert



    Bei SendText...:
    Mit dem getItem(x) rufts du genau das auf was du in dem Adapter codiert hast, es wird also jetzt mFragment2 zurückgegeben. Da der Adapter aber nicht ganz genau weiss was für ein Fragment das ist wird einfach ein Typ der Basisklasse (Fragment) zurückgeben. Da wir aber wissen dass das Fragment an Position 1 ein Fragment deines Types "Fragment2" zwei ist können wir den Rückgabewert von getItem() auch in diesen typ casten und danach die passDataToFragment Methode aufrufen.


    Sorry wenns ein bisschen kompliziert tönt, bin kein guter Lehrer ^^
    Würde dir aber vielleicht mal empfehlen ein Java Buch durchzumachen, mindesten den OOP Teil, zB hier
    http://openbook.galileocomputing.de/javainsel/


    Gruss
    antifish

  • das war echt ein wenig kompliziert ?(


    ich musste es ein paar mal genau druchlesen bis ich es verstanden habe. ;)
    coole sache. ich bedanke mich nochmals herzlich für deine hilfe. das war eine gute lehrstunde für mich ;)
    werde mich bestimmt nochmal melden, wenn ich bei irgendwas nicht weiter weiß. dankeee

  • hallo antifish,


    hoffentlich hast du dich von deiner krankheit erholt. wollte mich nochmals bedanken für die hilfe. ;)
    eventuell könntest du mir nochmal einen ratschlag zu dieser fragestellung geben? der link:

    HTML
    http://android-developers.de/anf%C3%A4ngerfragen/googlemaps-v2-in-fragment-activity-instanziieren-4360.html


    das wäre echt super korrekt :)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!