2015-07-13 107 views
4

我只有一个Activity只有一个关联的FragmentFragmentNavigation Drawer的一部分。现在我有一个不断变化的ArrayList<String>。我希望它能够在我打开Navigation Drawer时将ArrayList传递给Fragment从活动发送数据(ArrayList)到片段

Fragment有一个ListView它填充了ArrayList

这是ActivityToolbar代码和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>ActivityFragment

此外,我看不到Activity代码中的哪一点可以实际传递数据。

PS:大部分代码都是YouTube视频系列中显示的代码的修改版本。它以现在的形式运作。

+0

这取决于您的代码。你必须至少展示你的活动的代码。 – eleven

+0

@Foxinsocks为“Activity”和“Fragment”添加了代码。 –

+0

而不是在打开抽屉时将数据传递给片段。在需要时,让片段使用接口从活动中提取数据。通常在onResume()中。 – doubleA

回答

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; 
    } 
} 
+0

谢谢!像魅力一样工作! –

1

使用EventBus(如https://github.com/greenrobot/EventBus)。定义您自己的活动,如NavigationDataChangedEvent并在Fragment.onDestroyView()中注册您的片段NavigationDataChangedEventFragment.onViewCreated()取消注册(重要的是为了避免内存泄漏)。每当数据发生变化以通知片段时,活动可以简单地发布NavigationDataChangedEvent。通过使用EventBus,您的活动和片段被解耦...