2013-10-24 67 views
0

我正在与ViewPager和我有三个片段Fragment A, Fragment B and Fragment C其中Fragment AFragment B要沟通Fragment C。我已经实现了通信逻辑,但这里是这样的:当数据从Fragment B传递时,我无法刷新/更新Fragment C的视图。一切正常,当Fragment AFragment 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(); 
    } 
} 

其中popPassMediaInterface的一个实例。

在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 ...但他们没有提到的方式来更新UI。

回答

1

ViewPagers创建右和(如果有的话)左片段的实例自动。在你的情况下, C没有被B更新,因为它已经被添加,并且C的onCreate方法不会被调用。
如果您从片段A添加它,因为您只有A片段和B片段,C将会被创建。
解决方案如果不存在,请不要添加您的C片段,取得C片段并更新它(使用find fragmentByTag)。

+0

谢谢你的解释。弄清了很多事情。但我该如何更新C? –

+0

您可以在您的活动中声明一个属性,例如mediaPosition。用方法点击时,从片段A和B更新它。然后在您的活动中编写您的逻辑:如果找到片段C,只需将其媒体位置设置为mediaPosition,然后调用寻呼机setCurrentItem。在你的片段的简历C播放你的媒体。如果C没有被发现传递媒体位置片段C并添加C.在恢复它可以播放你的媒体。 – Devrim

+0

或者当你在pager上的currentItem变成A或B时删除你的C片段。并且不要改变你当前的逻辑。 – Devrim

1

如果我的理解正确,问题是当片段B可见时,片段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

这里的问题是,我在FragmentC的onCreateView中实例化了两个单独的视图...我是否根本不调用onCreateView并将所有GUI更新代码放在这里? –

+0

'onCreateView'将被系统调用,你不应该自己调用它。但是你可以做的是将创建UI的代码放到一个单独的方法中,然后你可以从'onCreateView'和'setUserVisibleHint'调用它来确保你的GUI始终存在。如果界面非常沉重(如果可能创建两次并不是一个好主意),那么可以在'setUserVisibleHint'中添加一些逻辑来检查GUI是否已经创建,并且只需更改需要更改的任何需要。 –

+0

使用setUserVisibleHint给我在FragmentB上的AsynTask错误...我有数据在FragmentB的onCreateView中加载。 –