2017-12-29 15 views
0

ビューパージャがスワイプを検出したときに自分のアクティビティを呼び出してフラグメントを呼び出そうとしています。インターフェイス経由でフラグメントと通信するためのアクティビティを取得できません

ここに私のアクティビティコードがあります。

public interface SwipeListener { 
    void swipe(); 
} 

private SwipeListener mSwipeListener; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_catalog); 
    ButterKnife.bind(this); 
    setSupportActionBar(mToolbar); 

    int startingFragmentPosition = 0; 

    mSwipeListener = (SwipeListener) this; 

    ClothingSectionsPagerAdapter sectionsPagerAdapter = 
      new ClothingSectionsPagerAdapter(getSupportFragmentManager()); 
    sectionsPagerAdapter.setContext(this); 
    mViewPager.setAdapter(sectionsPagerAdapter); 
    mTabLayout.setupWithViewPager(mViewPager); 
    mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mTabLayout)); 
    mTabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mViewPager)); 
    mViewPager.setCurrentItem(startingFragmentPosition); 

    mViewPager.setOnDragListener(new View.OnDragListener() { 
     @Override 
     public boolean onDrag(View view, DragEvent dragEvent) { 
      mSwipeListener.swipe(); 
      return false; 
     } 
    }); 
} 

私の断片では、このインタフェースを実装してメソッドをオーバーライドします。しかし、私はアプリを実行するとき。 onCreateメソッドでthisSwipeListenerをキャストできないとクラッシュします。これをどうやって解決するのですか?

+0

達成しようとしていることを説明できますか、スワイプアクションをフラグメントに送信しますか? –

+0

断片のデータ読み込みが早く始まるようにします。現在、スワイプイベントがあると、フラグメントはデータを自動的にロードしません。 –

+0

loadメソッドをアクティビティから呼び出して、フラグメントに直接渡すことができます(https://stackoverflow.com/questions/8785221/retrieve-a-fragment-from-a-viewpager)。これに対するリスナの実装はAFAIKが間違っています。 –

答えて

1

これは、アクティビティをSwipeListenerとしているためです。 フラグメントはこのインターフェイスを実装し、このフラグメントをSwipeListenerとして配置する必要があります。

フラグメントのリストを作成する(アクティビティで作成する)ようにして、リファレンスを作成するか、フラグメントのリストを作成するのと同じ方法でSwipeListenerを作成することをお勧めします。

0

これは動作しません。パブリッシャーコンポーネントにコールバックを登録する必要があります(あなたのケースではアクティビティー)。 スワイプアクションをフラグメントフォームアクティビティに渡す場合。 FragmentにSwipeListenerを実装し、それをActivityに設定する必要があります。以下は例です。

public class MainActivity extends AppCompatActivity { 
private List<SwipeListener> listeners = new ArrayList<>(); 
public void addSwipeListener(SwipeListener listener) { 
    listeners.add(listener); 
} 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_new); 
    mViewPager.setOnDragListener(new View.OnDragListener() { 
     @Override 
     public boolean onDrag(View view, DragEvent dragEvent) { 
      for (SwipeListener listener : listeners) { 
       listener.swipe(); 
      } 
      return false; 
     } 
    }); 
} 

}

および実施例断片。

class FragmentA extends Fragment implements SwipeListener{ 
@Override 
public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
((MainActivity)getActivity()).addSwipeListener(this); 
    super.onActivityCreated(savedInstanceState); 
} 

    @Override 
    public void swipe() { 
     // here you will get callback 
    } 
} 

複数のフラグメントを管理できるようにコールバックのリストを作成しました。必要に応じて変更できます。そして、フレグメンツのデタッチでリスナーを削除することを忘れないでください。

+0

'getActivity()'呼び出しは 'onCreateView()'で 'null 'になる可能性がありません。私はそれが 'onActivityCreated()'にあるべきだと思います。 –

関連する問題