Activity 传输数据到 Fragment

41 阅读1分钟

如果使用 Intent 传输数据会破坏Fragment的独立性。可以这样做:
在Fragment中写一个静态函数:newInstance(需要传输给Fragment的数据)

public class TestFragment extends Fragment{

    private static final String ARG_CRIME_ID = "crime_id"; // 自定义键

    @Override
    public void onCreate(Bundle savedInstanceState) {...}
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {...}
    
    // 自定义函数 newInstance ,以供 MainActicity 调用
    public static CrimeFragment newInstance(UUID crimeId) {
        Bundle args = new Bundle();
        // 放入传输的数据
        args.putSerializable(ARG_CRIME_ID, crimeId);
        TestFragment fragment = new TestFragment();
        // 设置传输的数据并返回
        fragment.setArguments(args);
        return fragment;
    }    
}

MainActivity 这边,在onCreate方法中:

UUID crimeID = UUID.randomUUID();

FragmentManager fm = getSupportFragmentManager();
Fragment fragment = fm.findFragmentById(R.id.fragment_container);
if (fragment == null) {
    fm.beginTransaction()
        .add(R.id.fragment_container, TestFragment.newInstance(crimeId))
        .commit();
}

Fragment就可以拿到数据,可以这样拿:在Fragment中的onCreate方法中

public class TestFragment extends Fragment{

    private static final String ARG_CRIME_ID = "crime_id"; // 自定义键

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // 拿到Activity传过来的数据
        UUID crimeId = (UUID) getArguments().getSerializable(ARG_CRIME_ID);
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {...}
    
    // 自定义函数 newInstance ,以供 MainActicity 调用
    public static CrimeFragment newInstance(UUID crimeId) {
        Bundle args = new Bundle();
        // 放入传输的数据
        args.putSerializable(ARG_CRIME_ID, crimeId);
        TestFragment fragment = new TestFragment();
        // 设置传输的数据并返回
        fragment.setArguments(args);
        return fragment;
    }    
}