好的,所以我有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,我希望将列表放在它自己的类中,因为我将在其他类中使用它。
答案 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回到前面时,它会注意到更改