Android中Activity与Fragment之间数据相互传递

一、Activity启动Activity

Intent intent = new Intent(this,MainListActivity.class);
startActivity(intent);
Activity与Activity传递数据
Intent intent = new Intent(this,MainListActivity.class);
// 可直接调用putXxx()方法 或 创建Bundle对象,完成参数传递
 intent.putString(TAG,"data");
 intent.putExtra(TAG,0);
...
startActivity(intent);

这样传递没什么问题,为了更好地实现模块独立,我们可以在被启动的Activity(MainListActivity)中创建一个static方法来启动。把传递的参数放到newIntent()方法的参数中传递,这样需要启动DetailActivity的Activity就不用处理具体的业务逻辑,相关的操作都由DetailActivity实现。

 public static final String EXTRA_CRIME_ID = "com.demo.happy.criminal.crime_id";

// 需要传递的数据,直接放在参数中即可
  public static Intent newIntent(Context packageContext, UUID crime_id){
        Intent intent = new Intent(context,DetailActivity.class);
        intent.putExtra(EXTRA_CRIME_ID,crime_id);

        return intent;
    }

这样我们只需在DetailActivity中调用newIntent(),该方法传入需要传递的数据即可

 Intent intent = DetailActivity.newIntent(getActivity(),crimeId);
 startActivity(intent);

二、从Fragment中启动Activity

Fragment启动Activity类似于Activity启动Activity,直接调用fragment.startActivity(Intent),然后在后台触发调用对应的Activity方法。

和Activity中启动方法一样,此处代码省略

数据传递

在实际应用中,我们不仅要启动某个Activity或者Fragment,更多是它们之间的数据传递。

1)Activity获取Fragment中的数据

把所需要的参数作为newIntent()的参数传递过去
Fragment

  Intent intent = MainActivity.newIntent(getActivity(), id);

Activity

 public static Intent newIntent(Context context, UUID crime_id){
        Intent intent = new Intent(context,MainActivity.class);
        intent.putExtra(EXTRA_CRIME_ID,crime_id);

        return intent;
    }
2)Fragment获取Activity中的数据

首先呢,我们可以通过Intent,直接携带参数传递,简单、方便。然而这种方法破坏了fragment的封装性,MainFragment不再是独立的构建单元,因为它现在由某个特定的activity托管,该activity的Intent定义了EXTRA_CRIME_ID的Extra无法在适用于其他任何activity
Activity

 public static Intent newIntent(Context context, UUID crime_id){
        Intent intent = new Intent(context,MainActivity.class);
        intent.putExtra(EXTRA_CRIME_ID,crime_id);

        return intent;
    }

Fragment

 UUID crimeId = (UUID) getActivity().getIntent().getSerializableExtra(MainActivity.EXTRA_CRIME_ID)
 crime = CrimeLab.get(getActivity()).getCrime(crimeId);

第二种方法,附加argument给fragment,调用Fragmen.setArguments(Bundle)方法,而且必须在ftagment创建后,添加activity(托管fragment的activity)前完成。

也就是说,再创建MainFragment实例时,直接把传递的数据传递过去,直接在MainFragment里面调用获取数据,所有的业务逻辑都在MainFragment里面实现,实现了模块的独立性。

  public static MainFragment newInstance(UUID crime_id) {
        Bundle bundle = new Bundle();
        bundle.putSerializable(ARG_CRIME_ID, crime_id);

        MainFragment fragment = new MainFragment();
        fragment.setArguments(bundle);
        return fragment;
    }

获取argument
先调用Fragment的getArguments()方法,再调用Bundle的限定类型getXxx()方法

  UUID crimeId = (UUID) getArguments().getSerializable(ARG_CRIME_ID);
  crime = CrimeLab.get(getActivity()).getCrime(crimeId);

其实为了更好的实现模块的独立性,都是在获取数据的Activity或Fragment中创建静态方法实现具体的业务逻辑,而设置数据的Activity或Fragment负责调用静态方法,把需要传递的数据放入参数中即可。

你可能感兴趣的:(安卓开发)