0

Ich entwickle gerade eine App, die eine JSON-Datei über Karten in der Hauptaktivität anzeigt. Abhängig davon, welche Registerkarte gerade in meiner Tab-Aktivität ausgewählt ist, entscheidet eine Methode, die die JSON-Datei herunterlädt, welche JSON-Datei heruntergeladen werden soll (ich übergebe eine Ganzzahl und es gibt einen Schalter in der Methode). HierDie aktuell ausgewählte Registerkarte einer Aktivität mit Registerkarten

ist die Methode:

Fragment.Downloadjson(rootview,integer,context); 

Nun, für meine Tabbed Aktivität ich einen SectionsPagerAdapter haben, die die üblichen Sachen hat: getItem, getCount und getPageTitle.

In getItem ich meine neue Fragmente erschaffe:

@Override 
     public Fragment getItem(int position) { 
      View v1 = getWindow().getDecorView().getRootView(); 
      switch (position) { 
       case 0: 
        //Fragment.Download(v1,0,getApplicationContext()); 
        return new Fragment().f(Fragment.page.TODAY); 
       case 1: 
        //Fragment.Download(v1,1,getApplicationContext()); 
        return new Fragment().f(Fragment.page.TOMORROW); 
       default: 
        return new Fragment(); 
      } 
     } 

Ausnahme:

android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 

ich die Quelle dieser Fehler gefunden haben die RootView Parameter in meiner Methode zu sein, weil es funktioniert in onCreateView mit rootView als Parameter, weil ich es dort definieren. Hovewer, kann ich nicht machen eine if-Anweisung für die aktuell ausgewählte Registerkarte oder zur Zeit dort angezeigt Fragment, weil

a) Ich weiß nicht, wie die aktuell ausgewählte Registerkarte

b zu bekommen) bin ich nicht sicher, ob es Download würde die jSON-Datei wieder, nachdem ich die Registerkarte wechseln, denn schließlich würde die If-Anweisung in seine onCreateView

Also, meine Frage ist,

wie löse ich das?

+0

Überprüfen Sie diesen Link für den aktuellen Tab http://StackOverflow.com/Questions/3583405/Get-Index-of-Selected-Tab-in-Tabhost –

+0

@BrahmamYamani Ich habe keine Tabactivity, ich benutze die vorkonstruierte _tabbed activity_ von android studio. Daher kann ich Tabhost nicht verwenden. –

Antwort

1

Tun Sie es nicht innerhalb getItem() Methode. In getItem einfach das Fragment erstellen.

@Override 
public Fragment getItem(int position) { 
    switch (position) { 
     case 0: 
      return new MyFragment0(); 
     case 1: 
      return new MyFragment1(); 
     case 2: 
      return new MyFragment2(); 
    } 
    return null; 
} 

außer Kraft setzen das Verfahren instantiateItem und in eine Karte von Fragment und ihre Position zu halten:

private ArrayMap<Integer, MyFragmentBaseClass> mPagerFragmentMap = new ArrayMap<>(); 


    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     MyFragmentBaseClass fragment = (MyFragmentBaseClass) super.instantiateItem(container, position); 
     mPagerFragmentMap.put(position, fragment); 

     return fragment; 
    } 

noteMyFragmentBaseClass kann ein Marker-Schnittstelle sein, dass alle Fragmente implementieren.

Mit dem obigen Code können Sie jedes Fragment bereits seiner Registerkarte zuordnen.

Wenn Sie TabLayout verwenden Sie jetzt einen Zuhörer setOnTabSelectedListener und onTabSelected eine seiner Methoden verwenden können festlegen, wann der Benutzer die Registerkarte auswählt und führen Sie eine beliebige Operation, die Sie wollen.

+0

Und wenn ich kein Tablayout habe? –

+1

Es kommt darauf an. Was verwenden Sie, um die Registerkarten zu implementieren? Das einzige, was Sie brauchen, ist die Registerauswahl zu erkennen. –

+0

Der veraltete Tablistener und alle veralteten Tab-Methoden (Wenn Sie eine neue Aktivität erstellen, gibt es eine "Tabbed Activity" Preset, das ist was ich verwende). Da diese Instanz das aktuelle Fragment zurückgibt, würde ich eine Art Methode benötigen, die etwas tut, wenn ich die Registerkarte ändere. Wie mache ich das? –