2013-10-24 3 views
0

ViewPager으로 작업 중이며 및 Fragment BFragment C과 통신해야하는 세 개의 조각 Fragment A, Fragment B and Fragment C이 있습니다. 나는 통신 로직을 구현했다. 그러나 여기에있다 : Fragment B에서 데이터가 전달 될 때 Fragment C의 뷰를 새로 고침/업데이트 할 수 없다. Fragment AFragment C이 통신해야하는 경우 모두 정상적으로 작동합니다. 전달 된 데이터에 따라보기가 업데이트됩니다.두 조각 사이의 업데이트/새로 고침/통신

Fragment C 여기는 MediaPlayer입니다. Fragment B에서 전달 된 미디어 URL을 재생하지만 레이아웃이 변경되었습니다. 누군가 여기서 무슨 일이 일어나는지 말해 주실 수 있습니까? 여기에 내가 지금까지 한 일이다 : popPassMediaInterface의 인스턴스

조각 위치 모두에서 인터페이스

public interface MediaInterface { 
    public void onPodCastClick(int position, 
      ArrayList<HashMap<String, String>> toPass); 
} 

와 B

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    // TODO Auto-generated method stub 
    String title = data.get(position).get("Title").toString(); 
    SM.setCurrentPlayedID(title); 
    popPass.onPodCastClick(position, data); 
} 

@Override 
public void onAttach(Activity activity) { 
    // TODO Auto-generated method stub 
    super.onAttach(activity); 
    try{ 
     popPass = (MediaInterface)getActivity(); 
    } catch(ClassCastException e){ 
     Log.i(tag, "Activity " + getActivity().getClass().getSimpleName() 
       + " does not implement the MediaInterface"); 
     e.printStackTrace(); 
    } 
} 

. 합니다 (ViewPager 구현 됨) MainActivity

@Override 
public void onPodCastClick(int position, 
     ArrayList<HashMap<String, String>> toPass) { 
    // TODO Auto-generated method stub 
    Bundle element = new Bundle(); 

    element.putSerializable("toPass", toPass); 
    element.putInt("position", position); 

    Fragment toGo = new FragmentC(); 
    toGo.setArguments(element); 
    FragmentTransaction transaction = getSupportFragmentManager() 
      .beginTransaction(); 
    transaction.add(toGo, "FragmentC").commit(); 
    pager.setCurrentItem(FRAGMENT_C); 
} 

프래그먼트 C 번들의 요소에 따라 상기보기에서 변경있다

Bundle element = getActivity().getSupportFragmentManager() 
        .findFragmentByTag("FragmentC").getArguments(); 

에서

.

무슨 일이 일어나고 있는지 그리고 어떻게이 조각을 새로 고치는 데 도움이되는지 알려주세요.

나는 또한 이것을 android developers documentation에서 보았지만 ... UI를 업데이트하는 방법은 언급하지 않았습니다.

답변

1

ViewPages는 인스턴스를 자동으로 생성하고 인스턴스를 생성합니다. 당신의 경우에; C는 이미 추가 되었기 때문에 B에 의해 업데이트되지 않으며 C의 onCreate 메소드가 호출되지 않습니다.
A와 B 조각 만 있기 때문에 조각 A에서 추가하면 C가 업데이트됩니다. C는 생성됩니다. 솔루션의 경우
은 C 조각이 있으면 추가하지 않고 C 조각을 가져 와서 업데이트합니다 (find fragmentByTag 사용).

+0

설명 주셔서 감사합니다. 많은 것을 명확하게했다. C를 어떻게 업데이트합니까? –

+0

활동에 mediaPosition과 같은 속성을 선언 할 수 있습니다. 방법으로 클릭이 발생하면 단편 A와 B에서 업데이트하십시오. 그런 다음 활동에 논리를 작성하십시오. 단편 C가 발견되면 매체 위치를 mediaPosition으로 설정 한 후 호출기 setCurrentItem을 호출하십시오. 프래그먼트 C의 재개시 미디어를 재생합니다. C가 발견되지 않으면 프래그먼트 C에 미디어 위치를 전달하고 C를 추가합니다. 다시 시작하면 미디어가 재생됩니다. – Devrim

+0

또는 호출기의 currentItem이 A 또는 B가 될 때 조각 C를 제거하십시오. 현재 논리를 변경하지 마십시오. – Devrim

1

올바르게 이해했다면 문제는 단편 B가 표시 될 때 단편 C가 이미 ViewPager에 의해 생성되어 페이지 간을 부드럽게 스크롤 할 수 있다는 것입니다. 즉, C의 onResume에서 인터페이스를 업데이트하더라도 Fragment B가 생성 될 때 이미 해당 메서드가 호출됩니다.

이 문제를 해결하기 위해, 당신은 당신의 조각이 실제로 활성화 될 때 알 수있는 setUserVisibleHint 방법을 덮어 쓸 수 있습니다 :

@Override 
public void setUserVisibleHint(boolean isVisibleToUser) { 
    super.setUserVisibleHint(isVisibleToUser); 

    if (isVisibleToUser == true) { 
     /* This means your fragment just became the active one. 
      You should call a GUI update function here. */ 
    } 
} 

그런 다음 당신은 새로운 데이터를 확인하고 그에 따라 인터페이스를 업데이트하는 기능이 필요합니다.

+0

여기에서 문제는 FragmentC의 onCreateView에서 두 개의 개별 뷰를 인스턴스화하는 것입니다 ... onCreateView를 호출하지 않고 모든 GUI를 업데이트하는 코드를 여기에 올려야합니까 ?? –

+0

'onCreateView'는 시스템에 의해 호출 될 것이므로 직접 호출해서는 안됩니다. 그러나 당신이 할 수있는 일은, UI를 생성하는 코드를 별도의 메소드에 넣는 것입니다. 그런 다음 여러분은'onCreateView'와'setUserVisibleHint'에서 호출하여 GUI가 항상 존재하는지 확인해야합니다. 인터페이스가 매우 무거울 경우 (두 번 생성하는 것이 좋지 않은 경우), GUI가 이미 생성되었는지 확인하고 변경해야하는 부분을 변경하기 위해'setUserVisibleHint'에 로직을 추가 할 수 있습니다. –

+0

setUserVisibleHint를 사용하면 FragmentB에서 AsynTask 오류가 발생합니다 ... FragmentB의 onCreateView에서 데이터가로드됩니다. –

관련 문제