2015-07-13 104 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,您的活動和片段被解耦...

相關問題