5

Ich habe eine MainActivity (FragmentActivity), die eine FragmentTabHost hat.FragmentTabHost & Fragments - Wie gebe ich Daten zwischen Tabs weiter?

public class FragmentTabs extends FragmentActivity { 
    private FragmentTabHost mTabHost; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.fragment_tabs); 
     mTabHost = (FragmentTabHost)findViewById(android.R.id.tabhost); 
     mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent); 

     mTabHost.addTab(mTabHost.newTabSpec("classA").setIndicator("Class A"), 
      ClassA.class, null); 
     mTabHost.addTab(mTabHost.newTabSpec("classB").setIndicator("Class B"), 
      ClassB.class, null); 
     mTabHost.addTab(mTabHost.newTabSpec("classC").setIndicator("Class C"), 
      ClassC.class, null); 
    } 
} 

KlasseA, ClassB und ClassC sind alle Fragmente (android.support.v4.app.Fragment).

Ich muss Daten (und Aufrufmethoden) auf den Fragmenten übergeben. Wie kann ich einen Verweis von jedem der Fragmente erhalten, wie folgt aus:.

ClassA mClassAFragment = ???; 

Ich habe versucht, mit getSupportFragmentManager() findFragmentByTag() und ich habe auch versucht, die Fähigkeiten von mTabHost zu erkunden. Nichts kann sie bekommen.

Können Sie einen Vorschlag machen oder einen alternativen Ansatz vorschlagen?

Antwort

11

OP hier. Zur Lösung dieses Problems Ich habe die onAttachFragment Methode in meinem FragmentActivity überlastet:

public class FragmentTabs extends FragmentActivity { 
    private FragmentTabHost mTabHost; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     ... 
    } 

    @Override 
    public void onAttachFragment(Fragment fragment) { 
    super.onAttachFragment(fragment); 

    if (fragment.getClass() == ClassA.class) { 
     ClassA mClassAFragment = (ClassA)fragment 
      ... 
     } 
    } 
} 
+0

Super Beratung. Ich denke, es ist ein ziemlich guter Ansatz, es so zu machen. – Siggy

+1

Ich denke, Sie sollten einen '.equals()' Vergleich für die Fragmentklassen anstelle eines direkten '== 'Vergleichers machen. – alexgophermix

+2

Oder intentionof wäre noch besser: 'fragment instanceof ClassA' – kgautron

3

Sie können Ihr Fragment wie diese:

YourFragment frag = (YourFragment) getSupportFragmentManager() 
        .findFragmentById(R.id.fragmentid)); 

Um Daten zu einem Fragment senden Sie diesen Ansatz folgen, eine neue Transaktion erstellen und die Daten durch ein Bündel zu senden.

Bundle arguments = new Bundle(); 
arguments.putString("some id string", "your data"); 
YourFragment fragment = new YourFragment(); 
fragment.setArguments(arguments); 
getSupportFragmentManager().beginTransaction().add(R.id.fragmentid, fragment).commit(); 
+8

Nicht schlecht. Leider funktioniert findFragmentById() nicht mit FragmentTabHost, da Fragmente nur erstellt werden, wenn sie die aktuell ausgewählte Registerkarte sind. I.e. ClassB und ClassC existieren nicht, bis ich sie auswähle. Ich werde Ihre Antwort als die Antwort markieren, weil ich denke, dass es ziemlich nah ist und es sehr hilfreich ist. Ich werde meine eigene Antwort für zusätzliche Informationen liefern. –

1

Dies kann durch das dritte Argument von android.support.v4.app.FragmentTabHost.addTab (tabspec, Klasse, Bündel args erreicht werden), dann können die args über android.support.v4.app.Fragment.getArguments()

public class Tab1Fragment extends BaseFragment { 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    // do something with the arguments 
    Log.i("DEBUG", "" + getArguments()); 
    // ... 
} 

}abgerufen werden, 210
+0

Leider nicht. Dies war eindeutig die ursprüngliche Absicht, aber "getArguments()" gibt dort immer null zurück. Schade, wirklich ... –

Verwandte Themen