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

로드 된 메서드를 activity에서 호출 한 다음 등록 된 조각을 가져 와서 조각에 직접 전달할 수 있습니다 (https://stackoverflow.com/questions/8785221/retrieve-a-fragment-from-a-viewpager). 이것에 대한 청취자 구현은 잘못된 AFAIK입니다. –

답변

1

활동을 SwipeListener으로 설정하려고했기 때문입니다. 조각에서이 인터페이스를 구현 한 다음이 조각을 SwipeListener으로 입력해야합니다.

여러분의 참조를 가질 수 있도록 조각 목록을 (작업에서 생성하는) ClothingSectionsPageAdapter에게 전달하는 것이 더 좋으며, 단편의 목록을 만드는 것과 같은 방법으로 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 
    } 
} 

콜백 목록을 만들었으므로 여러 조각을 관리하고 필요에 따라 수정할 수 있습니다. 그리고 fragmnent의 Detach에서 청취자를 삭제하는 것을 잊지 마십시오.

+0

'getActivity()'호출은 잠재적으로'onCreateView()'에서'null '이 될 수 없습니다. 나는 그것이 onActivityCreated()에 있어야한다고 생각한다. –

관련 문제