【问题标题】:Send data (ArrayList) from Activity to Fragment将数据(ArrayList)从 Activity 发送到 Fragment
【发布时间】:2015-07-13 00:19:51
【问题描述】:

我只有一个Activity 和一个关联的FragmentFragmentNavigation Drawer 的一部分。现在我有一个不断变化的ArrayList<String>。我希望这样,每当我打开Navigation Drawer 时,ArrayList 应该被传递给Fragment

Fragment 有一个ListView,其中填充了ArrayList

这是Activity,代码为ToolbarDrawerLayout

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 视频系列中显示的代码的修改版本。它以现在的形式工作。

【问题讨论】:

  • 这取决于您的代码。您必须至少显示您的活动代码。
  • @Foxinsocks 为ActivityFragment 添加了代码。
  • 而不是在打开抽屉时将数据传递给片段。让片段在需要时使用接口从活动中提取数据。通常在 onResume() 中。
  • 我相信如果使用 getInstance() 实例化片段会更好,然后在其上传递值..
  • @Sheychan 如果他只在 getInstance 中发送数据,那么每次他打开抽屉时它都不会更新。

标签: java android android-fragments arraylist


【解决方案1】:

在您的片段中执行此操作。

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

【讨论】:

  • 谢谢!像魅力一样工作!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-27
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2015-05-15
    • 2019-07-17
    相关资源
    最近更新 更多