8

저는 FragmentPagerAdapter에 익숙하지 않으므로이 설명은 우리가 (귀하가) 설명을 비판적으로 읽은 것 중 하나 일 것입니다.ViewPager와 두 개의 조각이있는 FragmentPagerAdapter입니다. 두 번째에서 첫 번째로 이동하고 첫 번째 텍스트를 업데이트하십시오.

구조 : 나는 한 번에 두 조각을 저장할 FragmentPagerAdapter (아래 코드)입니다. 첫 번째 부분은 책 발췌 부분을 표시하고 두 번째 부분은 책 제목 목록을 표시합니다.

목표 : 내가 제목에 설명되어 있습니다 무엇을 달성하고자하는 : 사용자가 호출기의 두 번째 조각을 탐색 제목을 클릭 한 다음 내가 첫번째 조각에 다시 사용자를 이동할 수 있으며, 첫 번째 조각에 텍스트를 업데이트하라고 알려줍니다. 첫 번째 단편은 이에 대한 방법이 triggerRefresh입니다.

코드 :FragmentPagerAdapter은 (내가 이해하지 못하는) 조각을 재사용/생성하기 때문에 문제가 발생한다고 생각합니다.

ViewPager mViewPager = (ViewPager) findViewById(R.id.pager); 
MyFragmentPagerAdapter mFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager()); 
mViewPager.setAdapter(mFragmentPagerAdapter); 

그리고 나는이 책 제목에서 콜백을받을 때, 나는 내 활동의 다른 곳에서 시도한 것입니다 :

static class MyFragmentPagerAdapter extends FragmentPagerAdapter { 

    public MyFragmentPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public int getCount() { 
     return NUM_ITEMS; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     switch(position) { 
     case 0: 
      return new ExcerptsFragment(); 
     case 1: 
      return new BookListFragment(); 
     default: 
      throw new IllegalArgumentException("not this many fragments: " + position); 
     } 
    } 
} 

이 내가 관련 회원을 생성하는 방법입니다 : 이것은 내 클래스 제목과 조각 선택 : 문제의

mViewPager.setCurrentItem(0); // back to excerpts screen page. It's OK. 
// Here's the problem! How to identify the fragment 0 
// to ExcerptsFragment and call its triggerRefresh()?!? 

시리즈 :

어댑터의 getView()을 호출하면 현재 연결된 어댑터가 아닌 ExcerptsFragment의 새 인스턴스가 반환되므로 (예상대로 예외가 발생 함) 작동하지 않습니다.

여기서 많은 사람들이 getView()에 조각을 저장하는 것을 보았습니다 (example). 그게 맞습니까? 공식적인 예를 살펴보면 나에게 반 패턴처럼 보일 수 있습니다 (아이템을 들고 자동 참조를 무시하십시오). 그리고 그것은 또한 의견 herehere입니다 (그리고 내게 옳은 것처럼 보입니다).

제안 사항? 나는이 모든 것을 이해하지 못한다면 놀라지 않을 것입니다 ...

답변

7

면책 조항 : 이것은 내게 완벽하게 잘 돌아 갔지만, 내부적으로 달라지는 전형적인 함정을 알아야합니다. , 사적인 행동. 내부 구현이 변경되면 결국 경고 메시지를 표시하는 테스트를 작성했지만 그 이후로는 greener pastures으로 이동했습니다. 그리고 당신도 그렇게해야합니다. 따라서,이 질문의 가치와 대답은 역사적인 것입니다. 그 질문에 대한 죄송합니다


, 나는 그것이 시간이었다 생각합니다.

이 문제를 해결하기 위해 나는 this solution을있는 그대로 구현했습니다. 잘 작동하는 것 같습니다. 그래서, 나는 그것의 ID가 어떻게 명명되는지를 알아내는 것만으로 (현재 붙어있는) 프래그먼트 인스턴스를 찾는 것이 문제라고 믿는다. 위의 링크는 어떻게 만들어 졌는지 설명합니다.

나는이 페이저에서 나를 좋아하는 초보자가 "실제 사례 시나리오"의 혜택을 볼 것이기 때문에 내 자신의 질문을 삭제하는 대신 대답하기로했습니다. 내가 본 대부분의 해답은 이론에 대해 가장 많이 이야기합니다. BTW는 올바른 방법입니다 ...하지만 나 같은 사람들이 때로는 잘 작동하지 않는 경우가 있습니다. 아니에요 때문에 그래서

int n = 0; 
mViewPager.setCurrentItem(n); // in the question I had stopped here. 

ExcerptsFragment f = (ExcerptsFragment) ContainerActivity.this 
     .getSupportFragmentManager().findFragmentByTag(getFragmentTag(n)); 
f.triggerRefresh(); 

// ... below the helper method: used the solution from the link. 

private String getFragmentTag(int pos){ 
    return "android:switcher:"+R.id.pager+":"+pos; 
} 

, 나는이 강력한 해결책이 느낌을 가지고 있어요 :

어쨌든, 여기에 내가 (위의 주석 부분)에 필요한 코드의 마지막 조각이다 (따라서 참조가 구식이 될 위험이 있습니다). 나는 최소한 내 자신의 코드를 유지했기 때문에 무언가 어리석은 짓을 할 확률을 최소화했다.

추가 할 항목이 있거나 표시하려면 무엇이 잘못되었거나 개선 될 수 있는지 알려주려면 물론 알려주십시오.

+0

태그를 할당하는 내부 메커니즘과의 호환성에 의존해서는 안됩니다. 비슷한 질문에 대한 내 대답을 올바르게 확인하는 방법을 참조하십시오. http://stackoverflow.com/questions/14035090/how-to-get-existing-fragments-when-using-fragmentpageradapter/41345283#41345283 – morgwai

+0

@morgwai 경고를 보내 주셔서 감사합니다. 나를. 잠재적 인 독자들에게 경고하기 위해 면책 조항이 포함되었습니다. – davidcesarino

+0

당신은 환영합니다 :) 나는 내 대답이 매우 새롭고 따라서 여전히 낮은 점수가 매겨지기 때문에 (물론 그 질문뿐만 아니라) 내 대답에 대한 링크를 직접 제공하는 것이 더 낫다고 생각합니다. 두 가지 모두 문제가있는 득점 답변. (왜'instantiateItem'을 오버라이드하는 솔루션만으로는 충분하지 않을지에 대한 해답을 설명해주었습니다) – morgwai

2

나는이 문제에 대한 해결책을 스스로 찾으려고 노력했다. 원칙적으로 접근 방식이 작동하지만 Android 기본 클래스 구현에서 조각 태그 생성 코드가 변경되는 경우 코드가 손상됩니다. 이것은 매우 불쾌한 의존성입니다!

좀 더 우아한 방법은 문제를 해결하고 기본 활동의 인스턴스를 조각에 보관하는 것입니다. 귀하의 액티비티에 태그에 대한 세터를 구현하고 생성시 조각 내에서이를 호출하십시오. 태그는 getTag()에서 간단하게 사용할 수 있습니다.

예제 구현은 here입니다.

+0

지금까지 아주 무작위적인 문제에 대한 최선의 해결책. 그러나 두 가지 : getActivity()를 사용하여 "부모 작업"에 대한 참조를 얻을 수 있습니다. 그리고 어댑터를 다시 만들 수도 있지만 조각이 아닐지라도 태그가 다시 설정되지 않기 때문에 구성 변경을 통해 태그 이름을 유지해야한다는 점을 명심해야합니다. – jpm

관련 문제