2013-10-24 3 views
0

Я работаю с ViewPager и у меня есть три фрагмента Fragment A, Fragment B and Fragment C, в которых Fragment A и Fragment B должны общаться Fragment C. Я реализовал логику связи, но вот что: я не могу обновить/обновить представление Fragment C, когда данные передаются от Fragment B. Все работает нормально, когда Fragment A и Fragment C предназначены для связи: просмотры обновляются в соответствии с переданными данными.Обновления/Освежающее/Обмен данных между двумя фрагментами

Fragment C здесь MediaPlayer ... Он воспроизводит медиа-адрес, связанный с Fragment B, но есть изменения в макете. Может кто-нибудь, пожалуйста, скажите мне, что здесь происходит. Вот что я сделал до сих пор:

Интерфейс

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

В обоих фрагмента A и 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(); 
    } 
} 

где popPass является экземпляром MediaInterface.

В MainActivity (где осуществляется ViewPager)

@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 ... но они не упомянули способ обновления пользовательского интерфейса.

ответ

1

ViewPagers создает право и (если есть) фрагменты фрагментов автоматически. В твоем случае; C не обновляется B, потому что он уже добавлен, и метод onCreate C не будет вызван.
C будет обновлен, если вы добавите его из фрагмента A, потому что у вас есть только фрагменты A и B, C будет создан.
для решения не добавляйте ваш C-фрагмент, если он существует, получите фрагмент C и просто обновите его (используйте find fragmentByTag).

+0

спасибо, что посмотрели. сделал много вещей ясным. но как мне обновить C? –

+0

Вы можете объявить свойство своей деятельности, например mediaPosition. Обновите его из фрагментов A и B, когда щелчок происходит с помощью метода. Затем напишите свою логику о своей деятельности: если найден фрагмент C, просто установите его медиапозицию в mediaPosition, а затем вызовите пейджеры setCurrentItem. При возобновлении фрагмента C воспроизведите медиа. Если C не найден, перейдите в медиа-позицию, чтобы фрагментировать C и добавьте C. В режиме возобновления он может воспроизводить ваши медиафайлы. – Devrim

+0

Или удалите фрагмент C, когда ваш currentItem на пейджере станет A или B. И не изменяйте свою текущую логику. – Devrim

1

Если я правильно понял, проблема заключается в том, что, когда отображается фрагмент B, также Fragment C уже создан ViewPager, чтобы обеспечить плавную прокрутку между страницами. Это означает, что даже если вы обновите свой интерфейс в C onResume, этот метод вызывается уже при создании фрагмента 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

проблема заключается в том, что я даю экземпляр двух отдельных представлений в onCreateView FragmentC ... я вообще не вызываю onCreateView и не устанавливаю здесь код обновления GUI здесь? –

+0

'onCreateView' будет вызываться системой, вы не должны называть его самостоятельно. Но то, что вы можете сделать, помещает код, который создает пользовательский интерфейс, в отдельный метод, который затем вы вызываете из 'onCreateView' и из' setUserVisibleHint', чтобы убедиться, что ваш графический интерфейс всегда есть. Если интерфейс очень тяжелый (если возможно его создание дважды - это не очень хорошая идея), вы можете добавить некоторую логику в 'setUserVisibleHint', чтобы проверить, был ли уже создан графический интерфейс и просто изменить все, что нужно изменить. –

+0

using setUserVisibleHint дает мне ошибку AsynTask на FragmentB ... У меня есть загрузка данных в onCreateView FragmentB. –

Смежные вопросы