2017-03-11 7 views
2

私のフラグメントのメソッドのいくつかを呼び出そうとしていますが、私はInfinite ViewPagerを通常のViewPagerではなく使用しています。フラグメントメソッド。アクティビティからInfiniteViewPagerフラグメントのメソッドを呼び出す方法

  1. IDをそのままInfinite ViewPagerフラグメントに設定することはできません。
  2. javaでfragmentタグを使用することができません。
  3. IはGetItemメソッドを試みたが、それがクラッシュ.ERROR

致命的な例外を生じる:メイン プロセス:beatbox.neelay.dialogtest2、PID:28997 java.lang.NullPointerExceptionが:起動しようとしnullオブジェクト参照の場合の仮想メソッド 'android.content.SharedPreferences android.content.Context.Context.getSharedPreferences(java.lang.String、int)' at beatbox.neelay.dialogtest2.Songdata.getPlayList(Songdata.java:26) at beatbox.neelay.dialogtest2.Songs.dataretrive(Songs.java:56) at beatbox.neelay.dialogtest2.MainActivity.onFragmentInteraction(MainActivity.java:134) at beatbox.neelay.dialogtest2.BlankFragment.onButtonPressed(BlankFragment.java:70) at beatbox.neelay.dialogtest2.BlankFragment $ 2.onClick(BlankFragment .java:60) android.view.View.performClick(View.java:5207) at android.view.View $ PerformClick.run(View.java:21177) at 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) at java.lang.reflect.Method.invoke(ネイティブメソッド) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:738) at com.android.internal InfiniteViewPagerで.os.ZygoteInit.main(ZygoteInit.java:628)

もう一つの問題は、ユーザーがスパイラルのようにそのをスワイプし続けるならば位置は同じではありませんです。 これは私が

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); 

InfiniteViewPager

と呼ばれ、私はメソッドを呼び出す方法を任意のヒントが参考になります

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

    } 

メソッドを呼び出すためにこの方法を試してみました方法です。

+0

sharedPreferenceがnullです。 –

答えて

1

通常は、アクティビティからフラグメントのメソッドを直接呼び出すことは悪い習慣です。

私は通知/リスナーメカニズムを使用することをお勧めします。これらのようなもの:

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. 
    } 
} 

notifySomeEventが呼び出されると、添付されているすべてのフラグメントが通知されます。

+0

だから私は – SAVVY

+0

を呼び出すし、addlisetnerからのアクティビティからメソッドを呼び出す方法をonEventに入れなければならない??メソッド – SAVVY

+0

はい、onEventメソッドで必要なメソッドを呼び出すことができます。私は2番目の質問を理解しているかどうかはわかりません。addListenerをアクティビティに実装する必要があります。すべてのリスナーのリストにリスナーを追加するだけです。 –

関連する問題