美文网首页
Fragment argument---不同托管Activity

Fragment argument---不同托管Activity

作者: 爱做梦的严重精神病患者 | 来源:发表于2019-01-02 15:42 被阅读0次

 要想在两个不同宿主ActivityFragment之间传递数据,首先要在Fragment中启动另一个Activity。

1.从fragment中启动activity

 调用Fragment.startActivity(Intent)。

public class CrimeListFragment extends Fragment{
    Intent intent = CrimeActivity.newIntent(getActivity(), mCrime.getId());
    startActivity(intent);
}

 当需要的数据通过Intent传递到Activity中后借助Argument将数据传递给Fragment。这样通过Argument传递,可以将Fragment与Activity相互独立

2.附加argument给fragment

 要附加argument bundle给fragment,需要调用Fragment.setArguments(Bundle)方法。而且,必须要在fragment创建后、添加给activity前完成

开发人员的习惯做法是:添加名为newInstance()的静态方法给Fragment类。使用该方法,完成fragment实例以及Bundle对象的创建,然后将argument放入bundle中,最后再附加给fragment

public class CrimeFragment extends Fragment {
    private static final String ARG_CRIME_ID = "crime_id";

    public static CrimeFragment newInstance(UUID crimeId) {
          Bundle args = new Bundle();
          args.putSerializable(ARG_CRIME_ID,crimeId);
          
          CrimeFragment fragment = new CrimeFragment();
          fragment.setArguments(args);
          return fragment;
        }

  @Override
  public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          UUID crimeId = (UUID) getArguments().getSerializable(ARG_CRIME_ID);
    }
}
public class CrimeActivity extends SingleFragmentActivity{
    public static Intent newIntent (Contenxt packageContext, UUID crimeId) {
          Intent intent = new Intent(packageContext, CrimeActivity.class);
          intent.putExtra(EXTRA_CRIME_ID, crimeId);
          return intent;
    }

    protected Fragment createFragment() {
        UUID crimeId = (UUID) getIntent().getSerializableExtra(EXTRA_CRIME_ID);
        return CrimeFragment.newInstance(crimeId); 
    }
}

3.通过fragment获取返回结果

 如需已启动的activity获取返回结果,则调用Fragment.startActivityForResult(...)方法,并且覆盖Fragment.onActivityResult(...)方法。

public class CrimeListFragment extends Fragment {
      Intent intent = CrimeActivity.newIntent(getActivity(), mCrimen.getId());
      startActivityForResult(intent, REQUEST_CRIME);

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(requestCode == REQUEST_CRIME) {
            
                }
       }
}

 尽管Fragment有自己的startActivityForResult(...)方法和onActivityResult(...)方法,但没有setResult(...)方法。所以,应该托管activity返回结果值

public class CrimeFragment extends Fragment {
      public void returnResult() {
           getActivity().setResult(Activity.RESULT_OK, data);
      }
}

相关文章

网友评论

      本文标题:Fragment argument---不同托管Activity

      本文链接:https://www.haomeiwen.com/subject/ofezlqtx.html