片段事务:如何将数据交换到以前的片段

时间:2014-03-27 21:26:12

标签: java android android-fragments

好的,所以我有MainActivity.java有一个名为FavoritesFragment.java的片段,在某些时候我称之为MyListFragment.java,人们应该选择一个列表元素。 之后我想在我的FavoritesFragment.java中找回自己的选择。

所以我实现了一个接口。在MyListFragment中,调用了一个方法,用于设置FavoritesFragment中的设置:

来自MyListFragment:

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    Station s = (Station) l.getItemAtPosition(position);
    updater.stationChosen(s, isFrom);
    getFragmentManager().popBackStack();
}

updater是我的界面。

所以,一切正常,FavoritesFragment中的内容已更新,所有内容都已更新。但在我致电popBackStack()之后,FavoritesFragment中的所有内容都重置为昔日荣耀。

当我以前用活动做所有事情时,有一个onActivityResult(...)回调,您可以从中回复数据。我怎么能用碎片做到这一点?我不想在这个小案例中使用Activities,我希望将列表放在它自己的类中,因为我将在其他类中使用它。

2 个答案:

答案 0 :(得分:1)

您需要一些地方来跟踪碎片之外的收藏夹。一个位置在托管片段的活动中,您可以通过getActivity()访问它并将其转换为MainActivity或您定义的某个界面。

例如:

public interface FavoriteManager {
  void onFavoriteAdded(Station s);
  void onFavoriteRemoved(Station s);
  List<Station> getFavorites();
  etc.
}

public class MainActivity extends FragmentActivity implements FavoriteManager {
  ...
  private List<Station> mFavorites;
  ...
  @Override
  public void onFavoriteAdded(Station s) {
    mFavorites.add(s);
  }
  ...
  @Override
  public List<Station> getFavorites() {
    return mFavorites;
  }
}

public class FavoritesFragment extends Fragment {
  ...
  @Override
  public void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    Station s = (Station) l.getItemAtPosition(position);

    FavoriteManager manager = (FavoriteManager) getActivity();
    manager.onFavoriteAdded(s);

    getFragmentManager().popBackStack();
  }
  ...
}

public class MyListFragment extends Fragment {
  ...
  @Override
  public void onStart() {
    List<Station> favorites = ((FavoriteManager) getActivity()).getFavorites();
    populateUi(favorites);
  }
  ...
}

另一种选择是使用数据库和ContentProvider,如下所示:http://developer.android.com/guide/topics/providers/content-providers.html

答案 1 :(得分:0)

考虑同时存在的碎片可能比一个接一个地更好(比如活动)。您没有调用片段并获得结果,但调用片段并允许它更改数据。

我认为最简单的方法是使用Observer模式让您的FavoritesFragment观察底层数据的变化,并确保MyListFragment的更新调用notifyobservers()。然后当FavoritesFragment回到前面时,它会注意到更改