我只有一个Activity
只有一个关联Fragment
。 Fragment
是Navigation Drawer
的一部分。现在我有一个不断变化的ArrayList<String>
。我希望这样,每当我打开Navigation Drawer
时,ArrayList
都应传递给Fragment
。
Fragment
有一个ListView
,其中填充了ArrayList
。
Activity
代码为Toolbar
和DrawerLayout
:
toolbar = (Toolbar) findViewById(R.id.app_bar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowHomeEnabled(true);
OnlineNavDrawerFragment drawerFragment = (OnlineNavDrawerFragment)
getSupportFragmentManager().findFragmentById(R.id.fragmentUsers);
drawerFragment.setUp((DrawerLayout) findViewById(R.id.drawer_layout), toolbar);
这是Fragment
:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_online_nav_drawer, container, false);
ListView lvOnline = (ListView) view.findViewById(R.id.lvOnlineUsers);
return view;
}
public void setUp(DrawerLayout drawerLayout, Toolbar toolbar) {
mDrawerLayout = drawerLayout;
mDrawerToggle = new ActionBarDrawerToggle(getActivity(), drawerLayout,
toolbar, R.string.drawer_open, R.string.drawer_close) {
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
getActivity().invalidateOptionsMenu();
}
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
getActivity().invalidateOptionsMenu();
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
mDrawerLayout.post(new Runnable() {
@Override
public void run() {
mDrawerToggle.syncState();
}
});
}
我遇到以下问题:如何将ArrayList<String>
从Activity
传递到Fragment
。
另外,我无法看到Activity
代码中的哪一点可以实际传递数据。
PS:大多数代码都是YouTube视频系列中显示的修改版本。它以目前的形式运作。
答案 0 :(得分:3)
在你的片段中这样做。
GetDataInterface sGetDataInterface;
public interface GetDataInterface {
ArrayList<String> getDataList();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
sGetDataInterface= (GetDataInterface) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + "must implement GetDataInterface Interface");
}
@Override
public void onResume() {
super.onResume();
if(sGetDataInterface != null){
mData = sGetDataInterface.getDataList();
}
}
}
在您的主要活动中
public class MainActivity implements YourFragmentName.GetDataInterface {
@Override
public ArrayList<String> getDataList() {
return mDataArrayList;
}
}
答案 1 :(得分:1)
使用EventBus(如https://github.com/greenrobot/EventBus)。定义您自己的活动,例如NavigationDataChangedEvent
,并在NavigationDataChangedEvent
中注册Fragment.onViewCreated()
的片段,在Fragment.onDestroyView()
中注册取消注册(对于避免内存泄漏很重要)。只要数据发生变化,活动就可以发布NavigationDataChangedEvent
来通知片段。通过使用EventBus,您的活动和片段被解耦......