美文网首页
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