0

我正在使用 aViewPager并且我有三个片段Fragment A, Fragment B and Fragment C可以在其中Fragment A进行Fragment B交流Fragment C。我已经实现了通信逻辑,但问题是:我无法刷新/更新Fragment C数据何时从Fragment B. Fragment A通信时一切正常Fragment C:根据传递的数据更新视图。

Fragment C这是一个MediaPlayer...它播放从 通信的媒体 url 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();

根据 Bundle 中的元素在视图中进行了更改。

请帮我弄清楚发生了什么以及如何刷新这个片段。

我也确实从android 开发人员文档中看到了这一点……但他们没有提到更新 UI 的方法。

4

2 回答 2

1

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

于 2013-10-24T16:45:21.713 回答
1

如果我理解正确,问题是当片段 B 可见时,片段 C 也已由 已创建,ViewPager以便在页面之间实现平滑滚动。这意味着即使您在 C 中更新了接口onResume,该方法也会在创建 Fragment B 时被调用。

为了解决这个问题,您可以覆盖 setUserVisibleHint 方法以了解您的 Fragment 何时真正变为活动状态:

@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. */
    }
}

然后你需要有一个函数来检查新数据并相应地更新接口。

于 2013-10-24T16:51:32.370 回答