2017-07-04 5 views
0

Ich möchte eine (Registerkarten-) Fragmentmethode aufrufen, um die Daten zur Aktivität zu bringen.Aufruf der Fragment-Methode aus der übergeordneten Aktivität

  1. las ich this
    • Aber ich habe null Objektreferenz
  2. Ich versuchte this
    • Aber meine Tätigkeit bereits das Fragment Klasse Umsetzung so ist es nicht ein juristischer Ausdruck
  3. So

, wenn die Registerkarte geändert ich die Form der ersten Registerkarte Details Aktivität senden möchten durch getDetails() Methode

 @Override 
     public void onTabUnselected(TabLayout.Tab tab) { 
      if (tab.getText().equals("Owner")) { 
       //invoking method here 
       Log.i(TAG, tab.getText().toString() + " unselected"); 
      } 

ich mit FragmentManager versucht, aber ohne Glück, bitte helfen!

Bearbeiten- Dies ist die Methode, die ich

public Bundle getData() { 
    Bundle bundle = new Bundle(); 
    bundle.putString("area", area); 
    bundle.putString("villageTown", villageTown.getSelectedItem().toString()); 
    bundle.putString("ownerName", ownerName); 
    bundle.putString("fatherHusbandName", fatherHusbandName); 
    bundle.putString("category", category.getSelectedItem().toString()); 
    bundle.putString("address", address); 
    bundle.putString("mobileNumber", mobileNumber); 
    bundle.putString("telephoneNumber", telephoneNumber); 


    return bundle; 
} 
+0

Haben Sie versucht, Zuhörer? Wie ein Interface erstellen, implementieren Sie es in Ihrer Fragment-Klasse und rufen Sie seine Methode von Activity auf? –

+1

Der schmutzige Weg: '((YourActivity) getActivity()).someMethodInActivity() ' – azizbekian

+0

@AnandSingh das ist, was in der zweiten Verbindung gegeben ist, implementiert meine Aktivität bereits eine Methode des Fragments, so dass ich nicht zurück zu der Aktivität im Fragment implementieren kann. –

Antwort

0
@Override 
     public void onTabUnselected(TabLayout.Tab tab) { 
      if (tab.getText().toString().equalsIgnoreCase("owner")) { 
       OwnerForm frag = (OwnerForm) getSupportFragmentManager().getFragments().get(0); 
       bundle = frag.getData(); 
      } 

      Log.i(TAG, tab.getText().toString() + " says hi"); //test statement 
     } 

getFragments().get() Verwendung hat den Trick für mich, ich wusste nicht, FragmentManager eine Liste aller aktiven Fragmente hält und so muss man getFragmentById() nicht verwenden, die das Null-Objekt Fehler verursacht.

0

ich hoch die Fragmente Logik empfiehlt halten in Fragment würde aufrufen wollen. Das Aufrufen einer Klasse aus einer Aktivität kann auf viele Arten erfolgen, z. B. über Schnittstellen. Aber die Aktivität, die eine Methode von Fragmenten aufruft, verursacht Probleme. Wenn Sie besonders versuchen, die Methode eines Fragments zu erreichen, die nicht auf dem Bildschirm angezeigt wird.

Sie können Ihre Daten dennoch in freigegebene Einstellungen aus dem Fragment schreiben, wenn das Formular ausgefüllt ist. Wenn onTabUnselected aufgerufen wird, können Sie Daten aus freigegebenen Einstellungen in Ihrer Aktivität lesen. Ich akzeptiere, dass es keine schöne Lösung ist. Ich hoffe ich habe dein Problem richtig verstanden.

+0

Ja, ich verstehe das völlig, aber die Methode ist eine Art Getter (siehe die Bearbeitung) –

+0

plus Ich möchte die Daten aufrufen, wenn die Registerkarte (Fragment) Änderungen, damit ich es nicht in dem Fragment aufrufen kann, soweit ich verstehe –

1

Ich nehme an, Sie verwenden eine ViewPager gebunden an eine Tab. Zuerst müssen Sie Instanzen Ihres Fragments, die Sie in Ihrem ViewPager verwenden, behalten.

Ich erklärte, wie Sie erhalten die Fragment-Instanzen, die Sie in ViewPager in dieser Antwort verwenden. https://stackoverflow.com/a/39274141/1559852

Sie benötigen eine andere onPageChangeListener Implementierung für Ihr Problem. Sie müssen lastSelectedPosition von ViewPager behalten und nach der ausgewählten Seite Ihre Daten an die Aktivität senden und dann die lastSelectedPosition aktualisieren. Hier ist eine Beispielimplementierung

int lastSelectedPosition = viewPager.getCurrentItem(); 

    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 

     @Override 
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

     } 

     @Override 
     public void onPageSelected(int position) { 
      // Here's your instance 
      YourFragment fragment =(YourFragment)yourPagerAdapter.getRegisteredFragment(lastSelectedPosition); 
      // Here're your details. You can update. 
      YourDetails details = yourFragment.getDetils(); 
      lastSelectedPosition = position; 
     } 

     @Override 
     public void onPageScrollStateChanged(int state) { 

     } 
    }); 

Ich hoffe, dass dir das helfen wird. Viel Glück.

+0

danke :) aber was ist "getRegisteredFragment", weil ich es nicht gefunden –

+0

müssen Sie Ihren benutzerdefinierten Adapter erstellen, wie ich in Link – savepopulation

+0

ich dachte, erläutert ein weg aus dem problem schon :) danke trotzdem –

Verwandte Themen