2017-03-11 3 views
2

J'essaie d'appeler une partie de la méthode de mon fragment, Mais la chose est que j'utilise ViewPager Infinie pas ViewPager normal. J'ai essayé la méthode suivante pour appeler la méthode du fragment .Comment appeler une méthode d'un fragment InfiniteViewPager de l'activité

  1. Je ne peux pas définir l'ID tel qu'il est dans un fragment Infinite ViewPager.
  2. Je ne suis pas en mesure d'utiliser la balise fragment dans java.
  3. J'ai essayé la méthode getItem mais entraînent dans un accident .error

FATAL EXCEPTION: principale processus: beatbox.neelay.dialogtest2, PID: 28997 java.lang.NullPointerException: Tentative d'invoquer méthode virtuelle 'android.content.SharedPreferences android.content.Context.getSharedPreferences (java.lang.String, int)' sur une référence d'objet nul at beatbox.neelay.dialogtest2.Songdata.getPlayList (Songdata.java:26) à beatbox.neelay.dialogtest2.Songs.dataretrive (Songs.java:56) à beatbox.neelay.dialogtest2.MainActivity.onFragmentInteraction (MainActivity.java:134) à beatbox.neelay.dialogtest2.BlankFragment.onButtonPressed (BlankFragment.java:70) à beatbox.neelay.dialogtest2.BlankFragment $ 2.onClick (BlankFragment .java: 60) à android.view.View.performClick (View.java:5207) à android.view.View $ PerformClick.run (View.java:21177) à android.os.Handler.handleCallback (Handler .java: 739) à android.os.Handler.dispatchMessage (Handler.java:95) à android.os.Looper.loop (Looper.java:148) à android.app.ActivityThread.main (ActivityTh read.java:5441) à java.lang.reflect.Method.invoke (méthode native) à com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:738) à com.android.internal .os.ZygoteInit.main (ZygoteInit.java:628)

un autre problème dans InfiniteViewPager est la position n'est pas le même si l'utilisateur continuer à glisser son comme une spirale. c'est la façon dont je l'appelle InfiniteViewPager

private InfiniteViewPager pager = null; 
private MyAdapter adapter; 
private InfinitePagerAdapter myAdapter; 

pager = (InfiniteViewPager) findViewById(R.id.pager); 
    FragmentManager fragmentManager = getSupportFragmentManager(); 


    adapter = new MyAdapter(fragmentManager); 
    myAdapter = new InfinitePagerAdapter(adapter); 
    pager.setAdapter(myAdapter); 

et j'ai essayé cette façon d'appeler la méthode

int pos = pager.getCurrentItem(); 
    Fragment activeFragment = adapter.getItem(pos); 
    if(pos == 2){ 
     ((Songs)activeFragment).dataretrive(); 
     ((Songs)activeFragment).dataset(); 

    } 

tout soupçon comment appeler la méthode sera utile.

+0

votre sharedPreference est null. –

Répondre

1

Habituellement, il est de mauvaise pratique d'appeler directement les méthodes du fragment de l'activité.

Je vous recommande d'utiliser ce mécanisme ussing notify/listeners. Quelque chose comme ceux-ci:

public interface SomeEventListener { 
    void onEvent(); 
} 

public interface SomeEventNotifier { 
    void addListener(SomeEventListener listener); 

    void removeListener(SomeEventListener listener); 
} 

public class ExampleActivity extends Activity implements SomeEventNotifier { 
    private final List<SomeEventListener> listeners = new CopyOnWriteArrayList<>(); 

    @Override 
    public void addListener(SomeEventListener listener) { 
     listeners.add(listener); 
    } 

    @Override 
    public void removeListener(SomeEventListener listener) { 
     listeners.remove(listener); 
    } 

    private void notifySomeEvent() { 
     for (SomeEventListener listener : listeners) { 
      listener.onEvent(); 
     } 
    } 
} 

public class ExamplpeFragment extends Fragment implements SomeEventListener { 
    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     if (isIntresterInSomeEvent()) { 
      SomeEventNotifier notifier = (SomeEventNotifier) getActivity(); 
      notifier.addListener(this); 
     } 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     if (isIntresterInSomeEvent()) { 
      SomeEventNotifier notifier = (SomeEventNotifier) getActivity(); 
      notifier.removeListener(this); 
     } 
    } 

    private boolean isIntresterInSomeEvent() { 
     //here you have to add you logic to determinate rather the instance of fragment need notification about the event 
     return true; 
    } 

    @Override 
    public void onEvent() { 
     //here you will get call when activity notifySomeEvent is called. 
    } 
} 

Tous les fragments attachés seront avisés lorsque notifySomeEvent est appelé.

+0

donc je dois mettre la méthode dans onEvent que je veux appeler – SAVVY

+0

et comment appeler la méthode de l'activité de addlisetner ??method – SAVVY

+0

Oui, vous pouvez appeler toutes les méthodes requises dans la méthode onEvent. Je ne suis pas sûr que j'ai compris la deuxième question: addListener devrait être implémenté dans votre activité, il devrait juste ajouter l'écouteur à la liste de tous les auditeurs. –